crontab(5) tabele do crona

OPIS

Plik crontab zawiera wskazówki dla demona cron(8), sformatowane w ogólnej postaci: "uruchom tę komendę o tej porze i tego dnia". Każdy użytkownik ma swoją własną tabelę crontab, a komendy z każdej podanej tabeli są wykonywane z uprawnieniami jej właściciela. News i uucp zazwyczaj mają swoje własne tabele, eliminując w ten sposób potrzebę jawnego wywoływania su(1) jako części komendy crona.

Puste wiersze, spacje oraz tabulacje są ignorowane. Wiersze, w których pierwszym nie-białym znakiem jest kratka (#), są komentarzami i też są ignorowane. Proszę zauważyć, że komentarze nie mogą wystąpić w tym samym wierszu co komendy crona, ponieważ będą one wtedy potraktowane jak część komendy. Podobnie, komentarze nie są dozwolone w wierszach ustawień zmiennych środowiskowych.

Aktywny wiersz tabeli może być albo ustawieniem środowiska, albo komendą crona. Plik tabeli jest przetwarzany od góry do dołu, tak więc ustawienie zmiennej środowiskowej będzie miało wpływ jedynie na komendy crona znajdujące się poniżej jej. Ustawianie zmiennej ma postać


    nazwa = wartość

gdzie spacje wokół znaku równości (=) są opcjonalne, a wszelkie kolejne, niepoczątkowe spacje w wartości zostaną częścią wartości przypisanej zmiennej nazwa. Łańcuch wartość może być umieszczony w cudzysłowach (pojedynczych lub podwójnych, lecz jednakowych w parze). Zachowa to początkowe i końcowe spacje. Aby zdefiniować pustą zmienną, trzeba zastosować cudzysłowy. Łańcuch wartość nie jest przetwarzany pod kątem podstawień zmiennych środowiskowych lub zastąpień zmiennych, tak więc wiersze takie jak


    PATH = $HOME/bin:$PATH

nie będą działać zgodnie z przewidywaniami. Tak samo będzie z tym przykładem:


    A=1
    B=2
    C=$A $B

Nie nastąpi podmiana zdefiniowanymi zmiennymi w ostatniej wartości.

Alternatywą do ustawiania ścieżki poleceń jest skorzystanie z faktu, że wiele powłok traktuje znak tyldy (~) jako podstawienie $HOME, więc w przypadku używania basha, można użyć


     SHELL=/bin/bash
     PATH=~/bin:/usr/bin/:/bin

Wiele zmiennych środowiskowych jest ustawianych automatycznie przez demona cron(8). SHELL jest ustawiany na /bin/sh, LOGNAME i HOME są ustawiane na podstawie wierszy /etc/passwd właściciela tabeli. PATH jest ustawiane na "/usr/bin:/bin". Zmienne HOME, SHELL i PATH mogą być przesłonięte przez ustawienia w tabeli. Nie można tak zrobić z LOGNAME, który jest użytkownikiem, z którego uruchamiane jest polecenie.

Inna uwaga: zmienna LOGNAME nazywa się czasem USER na systemach BSD... na tych systemach ustawiana będzie również zmienna USER.

Dodatkowo, poza powyższymi zmiennymi, cron(8) będzie korzystał z MAILTO jeśli zajdzie potrzeba wysłania listu jako wyniku wykonania komend z "tej" tabeli. Jeśli MAILTO jest zdefiniowane (i niepuste), to list zostanie wysłany do wskazanego tam użytkownika. Można podać wielu odbiorców, oddzielając ich przecinkiem. Jeśli MAILTO jest zdefiniowane, lecz puste (MAILTO=""), to nie są wysyłane żadne listy. W innych wypadkach listy są wysyłane do właściciela tabeli.

W systemach Debian GNU/Linux, cron obsługuje moduł pam_env i ładuje zmienną podaną w /etc/environment i /etc/security/pam_env.conf. Odczytuje również informacje o ustawieniach językowych z /etc/default/locale. Jednak ustawienia PAM NIE przesłonią ustawień opisanych powyżej, ani żadnych ustawień z samego pliku crontab. W szczególności, jeśli chce się ustawić zmienną PATH na inną niż "/usr/bin:/bin", konieczne jest wykonanie tego w samej tabeli.

Domyślnie, cron wyśle wiadomość używając nagłówka pocztowego "Content-Type:" z "text/plain" i parametrem "charset=" ustawionym na mapę znaków lub kodowanie ustawień językowych (locale), w momencie uruchomienia crond(8); to znaczy albo domyślnych ustawień systemowych, jeśli nie ustawiono zmiennych środowiskowych LC_* albo określonych zmiennymi LC_* (patrz locale(7)). Można użyć innego kodowania do wysyłanych wiadomości zadań crona, ustawiając zmienne CONTENT_TYPE i CONTENT_TRANSFER_ENCODING w plikach crontab, na właściwe wartości nagłówków pocztowych.

Format komendy crona jest podobny do standardu V7, z wieloma rozszerzeniami. Każdy wiersz ma pięć pól czasu i daty, za którymi znajduje się polecenie, kończące się znakiem nowego wiersza ("\n"). Systemowy plik crontab (/etc/crontab) używa tego samego formatu, z tym wyjątkiem, że po czasie i dacie, a przed poleceniem, znajduje się nazwa użytkownika. Pola mogą być oddzielone spacjami lub tabulatorami.

Polecenia są wywoływane przez demona cron(8), gdy minuta, godzina i miesiąc z wpisu odpowiadają czasowi bieżącemu oraz gdy przynajmniej jedno z dwóch pól dnia (dzień miesiąca lub dzień tygodnia) odpowiadają czasowi bieżącemu (patrz "Uwagi" poniżej). Program cron(8) sprawdza wpisy cron co minutę. Pola czasu i daty to:

Pole           dozwolone wartości

----          ------------------

minuta        0-59

godzina       0-23

dzień miesiąca1-31

miesiąc      1-12 (albo nazwy, patrz niżej)

dzień tygodnia0-7 (0 lub 7 jest niedzielą; albo nazwy)

Pole może mieć gwiazdkę (*), która oznacza "pierwszy-ostatni".

Dozwolone są zakresy liczb. Zakresy są dwiema liczbami, oddzielonymi myślnikiem. Zakres ten jest domknięty. Na przykład, 8-11 dla "godzin" oznacza wywoływanie w godzinach 8, 9, 10, 11.

Dozwolone są też listy. Lista jest zbiorem liczb (lub zakresów), oddzielonych przecinkami. Przykłady: "1,2,5,9", "0-4,8-12".

W połączeniu z zakresami można używać wartości krokowych. Napisanie za zakresem elementu "/<liczba>" oznacza odstępy między wartościami liczby w zakresie. Na przykład "0-23/2" oznacza liczby parzyste w tym zakresie (alternatywą w standardzie V7 jest "0,2,4,6,8,10,12,14,16,18,20,22"). Wartości krokowe dozwolone są też za gwiazdkami, więc jeśli aby zdefiniować "co drugą godzinę", można użyć po prostu "*/2".

Dla "miesięcy" i "dni tygodnia" można używać również nazw. Można użyć pierwszych trzech liter konkretnego dnia lub miesiąca (po angielsku, wielkość liter nie ma znaczenia). Zakresy lub listy nazw są niedozwolone.

Szóste pole (reszta wiesza) określa polecenie, jaką należy wykonać. Cała część polecenia wiersza, aż do nowego wiersza lub znaku %, zostanie wykonana przez /bin/sh, lub przez inną powłokę, jaką podano w zmiennej SHELL pliku crona. Procenty w komendzie (%), o ile nie są chronione odwrotnymi ukośnikami (\), zostaną zamienione w znaki nowego wiersza, a wszelkie dane za pierwszym % zostaną przesłane na standardowe wejście polecenia. Nie da się podzielić pojedynczego polecenia na wiele wierszy, tak jak w powłoce można to zrobić kończąc wiersz "\".

Uwaga: Dzień wywołania komendy może być podany w dwóch polach --- dniu miesiąca i dniu tygodnia. Jeśli obydwa pola są podane (np, nie są *), to komenda zostanie wywołana gdy dowolne z pól będą odpowiadały bieżącemu czasowi. Na przykład,
``30 4 1,15 * 5'' spowoduje wywołanie komendy o 4:30 pierwszego i 15-tego każdego miesiąca plus każdy piątek. Można jednak osiągnąć zamierzone działanie dodając do polecenia test (patrz ostatni przykład w PRZYKŁADOWY PLIK CRONA poniżej).

Zamiast pierwszych pięciu pól, można użyć jednego z ośmiu łańcuchów specjalnych:

łańcuch      znaczenie

-------       ---------

@reboot       uruchamia raz, przy rozruchu;

@yearly       uruchamia raz w roku, "0 0 1 1 *";

@annually     (to samo co @yearly);

@monthly      uruchamia raz w miesiącu, "0 0 1 * *";

@weekly       uruchamia raz w tygodniu, "0 0 * * 0";

@daily        uruchamia raz na dzień, "0 0 * * *";

@midnight     (to samo co @daily);

@hourly       uruchamia raz na godzinę, "0 * * * *".

Za rozruch, w przypadku łańcucha @reboot, uważa się rozruch demona cron(8). W szczególności, może być to wcześniej, niż uruchomią się pewne demony systemowe lub inne usługi. Jest to spowodowane kolejnością startową danego komputera.

PRZYKŁADOWA TABELA CRON

Poniżej znajduje się przykład pliku crontab użytkownika.

# używaj /bin/bash do wywoływania komend, zamiast domyślnego /bin/sh.
SHELL=/bin/bash
# przesyłaj wyjście do użytkownika "paul", bez względu na
# właściciela tabeli
MAILTO=paul
#
# uruchamiaj się 5 minut po północy, codziennie
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# uruchamiaj się o 14:15 pierwszego w każdym miesiącu -- wyjście jest
# przesyłane do użytkownika paul
15 14 1 * *     $HOME/bin/monthly
# uruchamiaj się o 22 w weekendy, denerwuj Joe.
0 22 * * 1-5   mail -s "Jest 22" joe%Joe,%%Gdzie są twoje dzieci?%
23 0-23/2 * * * echo "uruchamiaj 23 min po: północy, 2, 4 ..., codziennie"
5 4 * * sun     echo "Uruchamiaj o 4:05 w każdą niedzielę"
# uruchamiaj się co drugą niedzielą miesiąca
0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "druga niedziela"

PRZYKŁADOWA SYSTEMOWA TABELA CRON

Poniżej znajduje się zawartość standardowego, systemowego pliku crontab (z przetłumaczonym wyjaśnieniem). W przeciwieństwie do pliku crontab użytkownika, ten plik ma pole "nazwa użytkownika", zgodnie z /etc/crontab.

# /etc/crontab: systemowy crontab
# W przeciwieństwie do innych plików crontab, nie ma potrzeby
# uruchamiania polecenia "crontab" w celu zainstalowania nowej
# wersji pliku, po jego edycji i po edycji plików w /etc/cron.d
# Pliki te mają również pole "nazwa użytkownika", którego nie
# posiadają inne pliki crontab.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#m g d mies dztyg użytk polecenie
17 * * * *  root  cd / && run-parts --report /etc/cron.hourly
25 6 * * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

ROZSZERZENIA

Podczas podawania dnia tygodnia, zarówno 0 jak i 7 jest uważane za niedzielę. BSD i AT&T nie zgadzają się z tym.

Listy i zasięgi mogą koegzystować w tym samym polu. "1-3,7-9" będzie odrzucone przez crona AT&T i BSD -- chcą one widzieć TYLKO "1-3" lub "7,8,9".

Zakresy mogą zawierać "kroki", więc "1-9/2" jest tym samym co "1,3,5,7,9".

Nazwy miesiąca lub dnia tygodnia mogą być podawane przez nazwę (angielską).

W tabeli można ustawiać zmienne środowiskowe. W BSD i AT&T, środowisko przekazywane procesom potomnym jest po prostu tym z /etc/rc.

Wyjście poleceń jest przesyłane właścicielowi tabeli (BSD nie tego potrafi), może być przesyłane do osoby innej niż właściciel tabeli (tego nie potrafi SysV) lub funkcja ta może być wyłączona i nie będzie wysyłana żadna poczta (SysV tego też nie potrafi).

Wszystkie polecenia "@", które mogą pojawić się w miejscu pierwszych pięciu pól są rozszerzeniami.

OGRANICZENIA

Demon cron działa w zdefiniowanej strefie czasowej. Obecnie, nie obsługuje stref czasowych różnych dla konkretnych użytkowników. Wszystkie zadania: systemowe i użytkownika będą uruchamiane w skonfigurowanej strefie czasowej. Nawet jeśli użytkownik poda zmienną środowiskową TZ w swoim pliku crontab, to dotknie to wyłącznie poleceń wykonywanych w tej tabeli, a nie samych zadań crontab.

Składnia crontab nie daje możliwości zdefiniowania wszystkich wszystkich okresów, jakie można sobie wyobrazić. Przykładowo, nie jest łatwe zdefiniowanie ostatniego weekendu w miesiącu. Jeśli zajdzie potrzeba uruchomienia zadania w okresie, który nie może być zdefiniowany składnią crontab, to najlepszym wyjściem będzie wymuszenie sprawdzenia daty i czasu przez sam uruchamiany program i kontynuowanie wykonywania go tylko, jeśli dany okres jest właściwy.

Jeśli program nie może tego wykonać, to konieczny może być skrypt opakowujący. Przydatnymi narzędziami do analizy daty są ncal i calendar. Na przykład, aby uruchomić progra w ostatnią niedzielę każdego miesiąca, można użyć poniższego kodu opakowującego:

0 4 * * Sat   [ "$(date +\%e)" = "`ncal | grep $(date +\%a | sed  -e 's/.$//') | sed -e 's/^.*\s\([0-9]\+\)\s*$/\1/'`" ] && echo "Ostatnia niedziela" && program_do_wykonania

DIAGNOSTYKA

Program cron wymaga, aby każdy wpis w pliku crontab kończył się znakiem nowego wiersza. Jeśli ostatni wpis w pliku crontab nie będzie go posiadał (tzn. zakończy się bezpośrednio EOF), to cron stwierdzi, że crontab jest (przynajmniej częściowo) uszkodzony i odmówi jego instalacji. Ostrzeżenie zostanie wypisane do sysloga.

AUTOR

Paul Vixie <[email protected]> jest autorem crona i pierwotnym twórcą tej strony podręcznika systemowego. Niniejsza strona została również zmodyfikowana do Debiana przez Steve'a Greenlanda, Javiera Fernandez-Sanguino i Christiana Kastnera.

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Przemek Borys (PTM) <[email protected]>, Wojtek Kotwica (PTM) <[email protected]> i Michał Kułach <[email protected]>.

Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 3.0pl1 oryginału.