If-statement bash script, hjälp!

Permalänk

If-statement bash script, hjälp!

Hallå!

Har ett script som skickar över bilder till min server med hjälp av ett cronjob,

men för att kunna köra detta scriptet så måste min filserver vara online (obviously), så jag behöver hjälp med att köra ett if-statement(tror jag) innan scriptet för att säkerställa att servern är up and running..

Är verkligen ingen mästare på detta, så därför ber jag någon som är lite mera kunnig om hjälp, men scriptet borde väl iallafall pinga min lokala server, och om den returnar ett svar, så kan scriptet fortsätta, annars inte.

Själva scriptet:

#!/bin/bash lftp -c "set ftp:list-options -a; open ftp://user:pass@192.168.0.100; lcd /home/pi/bilder; cd /home/pi/bilder; mirror --reverse --use-cache --verbose --allow-chown --allow-suid --no-umask --parallel=2 --exclude-glob .svn" rm /home/pi/bilder/*;

Serverns ip: 192.168.0.100

Permalänk
Hedersmedlem

Generellt skulle du kunna använda något i stil med:

#!/bin/sh SERVER="192.168.0.100" if ! ping -c 1 "$SERVER" >/dev/null 2>&1; then printf 'error: cannot contact server %s\n' "$SERVER" 1>&2 exit 2 fi # Om du kommer hit i skriptet så funkade ping, så gör vad du vill.

Notera att jag bytte ut `#!/bin/bash` mot `#!/bin/sh` — det finns ingen anledning att dra igång hela Bash när du bara vill ha ett "enkelt" skalskript. Det finns mycket info att finna om skillnaderna (se exempelvis Dash as /bin/sh [Ubuntu wiki]), och på vissa system så må `/bin/sh` visserligen fortfarande vara länkat till just Bash (se exempelvis Shell shock för ett exempel av vad detta kan leda till…), men det är ingen god vana generellt.

Nästa förslag: använd Rsync i stället för FTP för att synka kataloger. Mycket mer rättfram, mycket mer effektivt (överför bara de bitar som ändras, med mer avancerade algoritmer än bara "kolla tidsstämpel"), säkrare (mindre viktigt lokalt, men det är då inget minus), och mer därtill. Rsync är generellt rätt verktyg för liknande synkroniseringar, även om nu `lftp` har implementerat en sorts speglingsmekanism över FTP som jag själv har haft användning av i vissa sammanhang.

Permalänk
Skrivet av phz:

Generellt skulle du kunna använda något i stil med:

#!/bin/sh SERVER="192.168.0.100" if ! ping -c 1 "$SERVER" >/dev/null 2>&1; then printf 'error: cannot contact server %s\n' "$SERVER" 1>&2 exit 2 fi # Om du kommer hit i skriptet så funkade ping, så gör vad du vill.

Notera att jag bytte ut `#!/bin/bash` mot `#!/bin/sh` — det finns ingen anledning att dra igång hela Bash när du bara vill ha ett "enkelt" skalskript. Det finns mycket info att finna om skillnaderna (se exempelvis Dash as /bin/sh [Ubuntu wiki]), och på vissa system så må `/bin/sh` visserligen fortfarande vara länkat till just Bash (se exempelvis Shell shock för ett exempel av vad detta kan leda till…), men det är ingen god vana generellt.

Nästa förslag: använd Rsync i stället för FTP för att synka kataloger. Mycket mer rättfram, mycket mer effektivt (överför bara de bitar som ändras, med mer avancerade algoritmer än bara "kolla tidsstämpel"), säkrare (mindre viktigt lokalt, men det är då inget minus), och mer därtill. Rsync är generellt rätt verktyg för liknande synkroniseringar.

Tack så mycket, precis vad jag letade efter!

Jo Rsync verkar bättre, men har inte riktigt fattat hur jag får det att fungera dock, får forska lite i det