Uruchamianie zadań cron co 15 minut lub 6 godzin

Spis treści

cron to takie linux'owe narzędzie, które cyklicznie, co pewien ustalony interwał czasu, wykonuje jakieś zaplanowane zadania. Minimalna wartość tego interwału to jedna minuta. Niemniej jednak, bardzo wielu użytkowników linux'a zastanawia się w jaki sposób wywołać określone zadanie, np. co 5, 10, 15, 30 minut, czy nawet co 2, 6 albo 12 godzin. Dlatego właśnie powstał ten wpis, by nieco przybliżyć mechanikę samego cron'a.

Tablica zadań cron'a (crontab)

Zadania, które cron przetwarza, mogą zostać umieszczone w kilku miejscach. Jednym z nich są katalogi /etc/cron.hourly/ , /etc/cron.daily/ , /etc/cron.weekly/ oraz /etc/cron.monthly/ . Nazwy tych folderów jasno wskazują kiedy umieszczone w nich zadania (skrypty) mają być wywoływane, tj. co godzinę, co dzień, co tydzień i co miesiąc. Zawartość tych katalogów jest obsługiwana przez plik /etc/crontab . To jest systemowa tablica cron'a. Poniżej jest przykład takiej systemowej tablicy:

# min hour day mon dow user command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 17   * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 17   * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 17   1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Każdy z tych wpisów odnosi się do określonego katalogu. Na początku takiego wpisu mamy coś na wzór 25 17 * * * . To jest instrukcja, którą cron się posiłkuje przy wykonywaniu zadań. W tym przypadku 25 i 17 oznacza godzinę 17:25 . To w tym czasie zostanie wywołane to drugie zadanie. Taka instrukcja się różni dla każdego z tych w/w wpisów, w zależności od tego, czy akcja ma być wywoływana co godzinę, co dzień, co tydzień czy co miesiąc. Wszystkie te wpisy dotyczą wywoływania skryptów obecnych w katalogach, o których wspomnieliśmy wyżej. Do obsługi zaplanowanych zadań użytkowników są przeznaczone inne tablice.

Każdy użytkownik w systemie może posiadać własną tablicę, które w debianie są umieszczone w katalogu /var/spool/cron/crontabs/ . Te tablice wyglądają podobnie do tej systemowej, z tą różnicą, że użytkownik definiuje w nich zwykle konkretne polecenia, a nie skrypty. Nic jednak nie stoi na przeszkodzie, by za pomocą tablicy użytkownika skrypty wywołać. Poniżej jest przykład tablicy użytkownika:

# min   hour    day     mon     dow     command
05    17 *  *  *  /usr/bin/gpg --refresh-keys > /dev/null 2>&1

Jedyna widoczna różnica to brak kolumny user . Powyżej mamy przykład zadania, które wykona się o godzinie 17:05 w każdym dniu, czyli co 24h. Jeśli zastąpimy 17 przy pomocy * , to wtedy to zadanie się będzie wykonywać co godzinę, za każdym razem w piątej minucie. Pozornie nie ma opcji, by wywołać to zadanie co 15 minut czy 6 godzin ale to tylko pozory. cron dzieli każdą godzinę na 60 minut, a każdy dzień na 24 godziny. Biorąc pod uwagę fakt, że minimalny interwał to jedna minuta, możemy nieco inaczej sprecyzować czas w instrukcji dla cron'a.

Wywoływanie zadania cron co 5, 10, 15 i 30 minut

Generalnie, to nie ma znaczenia dla nas czy cron ma wywołać jakieś zadanie co 5 minut czy co 30 minut. W każdym przypadku postępuje się w podobny sposób. Jako, że godzina ma 60 minut, to ten czas dla interwałów 5, 10, 15, 30 minut trzeba opisać w tablicy cron'a następująco:

*/5     *   *     *     *
*/10    *   *     *     *
*/15    *   *     *     *
*/30    *   *     *     *

W tym przypadku rozpatrujemy jedną godzinę, czyli 60 minut, zatem */5 oznacza interwał 5-minutowy począwszy od minuty 0, czyli 0, 5, 10, 15, etc. Tak samo wygląda to w każdej z pozostałych instrukcji.

Wywoływanie zadania cron co 2, 6 i 12 godzin

Podobnie sprawa wygląda w przypadku wywoływania zadać co kilka godzin. Z tym, że tutaj dysponujemy 24 godzinami i to tę liczbę trzeba wziąć pod uwagę. Zatem, instrukcja wygląda mniej więcej tak:

05    */2    *     *     *
05    */6    *     *     *
05    */12   *     *     *

W ten sposób */2 wywoła zadanie w godzinie 0, 2, 4, etc, czyli co dwie godziny. Trzeba przy tym zaznaczyć, że nic nie stoi na przeszkodzie, by korzystać z przecinka do precyzowania konkretnych godzin czy minut, przykładowo:

05    0,6,12,18   *     *     *

Ta powyższa instrukcja jest równoważna z zapisem */6 .

Wywoływanie skryptów

Możemy także utworzyć kolejny katalog dla skryptów w /etc/, dajmy na to /etc/cron.half-hour/ i umieszczać w nim takie skrypty, które mają być wywoływane co pół godziny. Niemniej jednak, trzeba dopisać w systemowej tablicy cron'a jedno zadanie, które będzie miało ustawione czas w formie opisanej w powyższych przykładach. Edytujemy zatem plik /etc/crontab i dopisujemy do niego tę poniższą linijkę:

*/30 *    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.half-hour )
Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.