2014-12-03, 13:14
  #1
Medlem
Hej!

Jag har ett script som crontab kör en gång i minuten, scriptet skickar över allting som ligger i '/home/pi/bilder' till min FTP server. Efter den har skickat över dessa filer, så tar den sedan bort det som ligger i '/home/pi/bilder' för att frigöra minne, MEN om min ftp server ej är tillgänglig, så körs ju scriptet och då tar den bort filerna som ligger lokalt, även att den inte har skickat över någonting till FTP servern. Så min fråga lyder alltså, hur gör jag så att den INTE tar bort filerna, ifall FTP servern inte är tillgänglig?

Kod:
#!/bin/bash
lftp -c "set ftp:list-options -a;
open ftp://användare:lösen@ip;
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/*;
__________________
Senast redigerad av superiorr 2014-12-03 kl. 13:34.
Citera
2014-12-03, 14:03
  #2
Medlem
ozzles avatar
Du kan kolla med nmap om servern är uppe, om den är det så fortsätt köra resten av skriptet.
Kod:
nmap -p ftp IP | grep open
Citera
2014-12-03, 14:05
  #3
Medlem
Citat:
Ursprungligen postat av ozzle
Du kan kolla med nmap om servern är uppe, om den är det så fortsätt köra resten av skriptet.
Kod:
nmap -p ftp IP | grep open

Okej!

Så då bör skriptet se ut såhär?

Kod:
#!/bin/bash
nmap -p ftp IP | grep open
lftp -c "set ftp:list-options -a;
open ftp://användare:lösen@ip;
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/*;
Citera
2014-12-03, 14:21
  #4
Medlem
ozzles avatar
Citat:
Ursprungligen postat av superiorr
Okej!

Så då bör skriptet se ut såhär?

Kod:
#!/bin/bash
nmap -p ftp IP | grep open
lftp -c "set ftp:list-options -a;
open ftp://användare:lösen@ip;
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/*;

Nej. Kör min kodsnutt i terminalen. Den kommer skriva ut en rad om servern är uppe och skriva ut noll rader om servern är nere. Detta kan du använda sedan i en if-sats för att avgöra om skriptet skall fortsätta köras eller kliva av scenen.
Citera
2014-12-03, 14:27
  #5
Medlem
Citat:
Ursprungligen postat av ozzle
Nej. Kör min kodsnutt i terminalen. Den kommer skriva ut en rad om servern är uppe och skriva ut noll rader om servern är nere. Detta kan du använda sedan i en if-sats för att avgöra om skriptet skall fortsätta köras eller kliva av scenen.

Konstigt nog fungerar det exakt som jag vill att det ska fungera, utan if-satser..
Citera
2014-12-03, 19:03
  #6
Medlem
divinings avatar
Citat:
Ursprungligen postat av superiorr
Konstigt nog fungerar det exakt som jag vill att det ska fungera, utan if-satser..

Inte alls konstigt, raden exekverar och har ingen inverkan på efterföljande
Citera
2014-12-03, 19:05
  #7
Medlem
Citat:
Ursprungligen postat av divining
Inte alls konstigt, raden exekverar och har ingen inverkan på efterföljande

Jaha okej! Är ny med sånt här vettu!
Citera
2014-12-03, 21:40
  #8
Medlem
Afros avatar
Ett tips, bara för att FTPn är uppe betyder det inte att bilderna har flyttats över korrekt och det är OK att ta bort dem.

Du kan använda något som kallas exit code/status, som talar om ifall programmet kördes korrekt eller inte. Ett exempel, skriv "ls denna_fil_finns_ej; echo $?" i terminalen, då får du

root@bleh:~$ ls denna_fil_finns_inte; echo $?
ls: cannot access denna_fil_finns_inte: No such file or directory
2

2 är en exit code. 0 betyder normalt att programmet kördes korrekt. tex

root@bleh:~$ ls fan; echo $?
fan
0

Du kan sedan använda && och || för att säga vad som ska hända om programmet kördes korrekt eller inte.

så efter att lftp har kört färdigt skulle jag lagt &&

Kod:
#!/bin/bash
lftp -c "set ftp:list-options -a;
open ftp://användare:lösen@ip;
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/*;
__________________
Senast redigerad av Afro 2014-12-03 kl. 21:43.
Citera
2014-12-03, 23:11
  #9
Moderator
vhes avatar
1. Skriv ditt script i /bin/sh, inte bash. För din framtida mentala hälsas skull. Och portabilitet och sånt.
2. Titta på -e-flaggan till shellscript. Inled med set -e. Då kommer scriptet avsluta om något kommando misslyckas. Misslyckande definieras av att exitkod (som Afro pratar om) är skild från 0.
3. Titta på rsync (så som rekommenderades i andra tråden). Det är en bättre metod än FTP. (Allt är bättre än FTP. Srsly.)
Citera
2014-12-14, 11:43
  #10
Medlem
Att köra rm * en gång i minuten i ett skal skript känns vågat.
Finns det inte en stor risk att filer raderas innan de hunnit kopierats?

Om filerna är viktiga, borde inte integriteten på de kopierade filerna säkerställas, innan ursprungsfilerna raderas. Jag skulle i så fall vilja göra en lista med filnamn och chksum.
Citera
2015-02-05, 20:55
  #11
Medlem
Freddyfishs avatar
jag skulle använt if-statement,

kör själv det för mina backuper


scp [fil] anv@ipaddress:/väg/till/mapp
if [ "$?" == "0" ]
then
rm [filer]
else
*vad scriptet ska göra om det inte kunde föra över*
fi
exit 0
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in