Jak korzystać z cron’a – monitorowanie zewnętrznego IP
Cron to proces w systemach unixowych, który ma za zadanie wywoływać w tle określone skrypty co jakiś ustalony interwał czasowy. Żeby nie pisać tu samej tylko teorii, rozważymy przykład jego zastosowania poprzez monitorowanie zmian zewnętrznego adresu IP.
We wstępie pokrótce wyjaśniliśmy sobie, czym jest cron. Ale w jaki sposób go skonfigurować? Do tego służy polecenie crontab
, gdzie wpisujemy kolejne zadania do wykonania. Wszystko wpisujemy według poniższego schematu:
* * * * * /ścieżka/do/pliku/ze/skryptem.sh
Pierwszych pięć gwiazdek wskazuje po kolei na interwał czasowy, w jakim zadanie ma być wykonanie. Patrząc na nie od lewej ustawiamy więc:
- minuty (wartości od 0 do 59)
- godziny (0 do 23)
- dni miesiąca (1 do 31)
- miesiące (1 do 12)
- dzień tygodnia (0 do 6, gdzie 0 to niedziela)
Jak to prawidłowo odczytywać? Wystarczy zapamiętać słowo “każdy”. Na przykład:
2 * * * * /ścieżka/do/pliku/ze/skryptem.sh
oznaczać będzie, że dany skrypt zostanie wywołany w 2 minucie każdej godziny, każdego dnia miesiąca, każdego miesiąca i każdego dnia tygodnia, ponieważ pozostawienie gwiazdek wywołuje zadanie co minutę, co godzinę, itd.
Załóżmy, że chcemy uruchomić zadanie każdego 1-ego dnia miesiąca dokładnie o 12 w południe. Nasz zapis wyglądać będzie następująco:
0 12 1 * * /ścieżka/do/pliku/ze/skryptem.sh
Studiując powyższy zapis, tłumaczymy go następująco:
- minut:
0
- o godzinie:
12
- dnia miesiąca:
1
- miesiąca:
*
(czyli każdego) - dnia tygodnia:
*
(czyli również każdego)
crontab
pozwala również na określanie przedziału czasowego. Załóżmy, że chcemy wykonać coś raz dziennie, ale tylko od poniedziałku do piątku. Zapiszemy to wtedy następująco:
0 10 * * 1-5 /ścieżka/do/pliku/ze/skryptem.sh
Wyjaśnienie “zegara” jest następujące:
- minut:
0
- o godzinie:
10
- dnia miesiąca:
*
(każdego) - miesiąca:
*
(każdego) - dnia tygodnia:
1-5
(czyli od poniedziałku do piątku)
W przypadku, gdy chcielibyśmy zlecić zadanie do wykonania co ileś minut (np. co 15) standardowy zapis wygląda następująco:
0,15,30,45 * * * * /ścieżka/do/pliku/ze/skryptem.sh
Należy zwrócić uwagę, że wartości liczbowe nie są oddzielane spacją. Ponieważ częstotliwość jest regularna, to samo zadanie można zapisać również tak:
*/15 * * * * /ścieżka/do/pliku/ze/skryptem.sh
Skoro trochę teorii już znamy, przejdźmy w końcu do naszego przykładu, czyli monitorowaniu zewnętrznego adresu IP. Oczywiście, jeśli ktoś posiada taki wykupiony adres, to nie powinien się on zmieniać, ale są przypadki, kiedy dostawca sam z siebie nam go zmieni (sam się z tym spotkałem kilka razy). Jako, że cron odczytuje skrypty, trzeba znaleźć sposób, by zczytać jakoś zewnętrzny adres IP. Na szczęście wystarczy chwilkę “wyguglować” i rozwiązanie znajduje się szybko. Może bez wnikania w szczegóły wyszukiwania, polecenie, które służy do “pobrania” naszego zewnętrznego IP uzyskamy na przykład wpisując w Terminalu:
curl -s ifconfig.me/ip
Teraz przydałoby się “ubrać” powyższe polecenie w plik ze skryptem. W tym celu otwieramy dowolny edytor tekstowy (może być TextEdit lub TextWrangler) i wpisujemy do niego:
#!/bin/sh
curl -s ifconfig.me/ip
Taki plik zapisujemy pod stosowną nazwą, np. ip.sh
w wybranym przez nas miejscu, np w folderze Documents
.
Teraz wreszcie przejdźmy do edycji crontab
. W tym celu w Terminalu wpisujemy:
crontab -e
Zostanie uruchomiony edytor tekstowy vi
. Wciskamy dowolną literę, a na dole okna Terminalu powinien pojawić się zapisek - INSERT-
, co oznacza, że możemy zacząć pisać. Aby więc sprawdzać nasz adres IP co 5 minut wpisujemy:
*/5 * * * * /Users/nazwauzytkownika/Documents/ip.sh
crontab
zapisujemy wciskając najpierw klawisz ESC
, a potem wpisując :wq
i zatwierdzając Enterem. Domyślnie crontab
wysyła wyniki zadań do terminalowego maila. Jako że korzystanie z niego nie jest szybkie, to “przekierujemy” sobie te wyniki do pliku tekstowego. Załóżmy, że wynik ma być zapisywany w pliku o nazwie ip.txt
w naszym folderze Dropboksa (będzie to dobre miejsce do zapisu, bo do Dropboksa mamy dostęp z dowolnego miejsca mającego łączność z internetem). W takim wypadku przechodzimy znowu do edycji listy zadań (crontab -e
), wciskamy dowolny klawisz w edytorze tekstowym, żeby przejść w tryb edycji, kursorem przechodzimy na koniec i dopisujemy:
>> /Users/nazwauzytkownika/Dropbox/ip.txt
Potem wciskamy znów ESC
, wpisujemy :wq
i wciskamy klawisz Enter
.
Całe utworzone zadanie powinno wyglądać więc tak:
*/5 * * * * /Users/nazwauzytkownika/Documents/ip.sh >> /Users/nazwauzytkownika/Dropbox/ip.txt
Czym są owe >>
? Wskazują, że kolejne wyniki mają być dopisywane do pliku ip.txt
. Jeśli chcielibyśmy natomiast trzymać tylko jeden, najświeższy wynik, to zastępujemy znaki >>
jednym >
.
I na koniec jeszcze ostatnia komenda, pozwalająca na podejrzenie ustawionych zadań w crontab
:
crontab -l
Źródło: Kevin van Zonneveld
Komentarze: 4
Błąd w zapisie: “oznaczać będzie, że dany skrypt zostanie wywołany co każdą 2 minutę po każdejpełnej godzinie, każdego dnia miesiąca, każdego miesiąca i każdego dnia tygodnia, ponieważ pozostawienie gwiazdek wywołuje zadanie co minutę, co godzinę, itd.” Skrypt nie będzie uruchamiany co każdą 2 minutę, lecz po prostu w drugiej minucie każej godziny. Co każdą 2 minutę byłoby gdyby był zapis */2 a samo 2 oznacza dokładną minutę i tylko w tej minucie godziny będzie się uruchamiał.
Ale napisałem “co każdą 2 minutę po (…) pełnej godzinie”, czyli się zgadza.
No nie do końca “co każdą 2 minutę po każdej pełnej godzinie” nie jest to logiczne. Oznacza to, że co każdą godzinę, skrypt zostanie uruchomiony w 2,4,6,8,10.. itd minucie. A on zostanie uruchomiony tylko 1 raz, dokładnie w 2 minucie każdej godziny.
Ok, przekonałeś mnie. ;)