18 Feb
Jak wiadomo, cron to bardzo przydatne narzędzie służące do uruchamiania przeróżnych komend (programów, skryptów itd.) wg ustalonego harmonogramu. Na przykład można dzięki temu automatycznie raz na dobę (albo co tydzień, albo co 2 godziny, albo co dwie godziny w dni powszednie a w weekendy co godzinę, albo jeszcze inaczej) wykonywać kopię zapasową. W tym celu można przygotować sobie taki oto skrypt powłoki:
#!/bin/sh ZAPISZTU='/backup' CZAS=`date +%Y-%m-%d_%H-%M-%S` PLIK=backup_"$CZAS".zip ZBACKUPUJTO='/var/www/htdocs' REMOTE='/backup/strona-www' HOST='ftp.twojserwer.pl' USER='uzytkownik-ftp' PASSWD='haslo-ftp' cd "$ZAPISZTU" zip -r9 "$PLIK" "$KATALOG" ftp -n $HOST <<END_SCRIPT quote USER $USER quote PASS $PASSWD cd $REMOTE put $PLIK quit END_SCRIPT rm "$ZAPISZTU"/"$PLIK"
Powyższy skrypt powłoki spakuje katalog /var/www/htdocs (rekurencyjnie, odpowiada za to opcja -r, cyfra 9 oznacza maksymalny stopień kompresji), zapisze archiwum w katalogu /backup, wyśle archiwum na serwer FTP i skasuje archiwum z dysku twardego. Oczywiście warto by było dorobić tu jeszcze jakieś przechwytywanie błędów, ale na potrzeby omawianego tematu nie będę tu zaciemniał kodu.
Odpalmy nasz skrypt “z ręki”:
# sh /sciezka/do/skryptu/skrypt.sh
Powinien zadziałać bez problemu.
Teraz dopiszmy go do cron-a. W tym celu dodajmy poniższy wpis do pliku /var/cron/tabs/root:
15 12 * * * /bin/sh /sciezka/do/skryptu/skrypt.sh >/sciezka/do/skryptu/skrypt.log 2>&1
Powyższy wpis odpali nasz skrypt codziennie o godzinie 12.15 a w pliku skrypt.log zapisze co się działo podczas wykonywania naszego skryptu. Koniecznie musimy podać pełne ścieżki! Teraz zrestartujmy cron-a i poczekajmy:
# kill `cat /var/run/cron.pid`
# /usr/sbin/cron
Gdy minie wskazana godzina zajrzyjcie na serwer FTP, czy coś się tam pojawiło. Albo nie zaglądajcie – powiem wam: nie pojawiło się. Dlaczego? Zajrzyjmy do pliku skrypt.log. I co? Ano kaszana – znajdziemy tam między innymi takie coś:
/sciezka/do/skryptu/skrypt.sh[15]: zip: not found
ftp: local: backup_2008-02-18_12-15-01.zip: No such file or directory
czyli:
Okazuje się, że przy odpalaniu skryptu powłoki za pomocą cron, nie dość że w tabeli cron-a musimy się posłużyć pełnymi ścieżkami, to i w samym skrypcie powłoki także. Oto jak powinien wyglądać poprawny skrypt:
#!/bin/sh ZAPISZTU='/backup' CZAS=`date +%Y-%m-%d_%H-%M-%S` PLIK=backup_"$CZAS".zip ZBACKUPUJTO='/var/www/htdocs' REMOTE='/backup/strona-www' HOST='ftp.twojserwer.pl' USER='uzytkownik-ftp' PASSWD='haslo-ftp' cd "$ZAPISZTU" /usr/local/bin/zip -r9 "$PLIK" "$KATALOG" ftp -n $HOST <<END_SCRIPT quote USER $USER quote PASS $PASSWD cd $REMOTE put $PLIK quit END_SCRIPT rm "$ZAPISZTU"/"$PLIK"
I to jest rozwiązanie problemu na jaki natrafia wielu początkujących użytkowników OpenBSD (w tej liczbie i ja ;-) ).