crontab

Z Wikipedii, wolnej encyklopedii

crontab – tabela programu cron mająca specjalny format oraz nazwa programu służącego do jej edycji. Etymologia nazwy odnosi się do języka greckiego (χρόνος [czyt. chronos] znaczy czas).

Program crontab wywoływany z linii poleceń z opcją -l wyświetla aktualną tabelę użytkownika. Opcja -r usuwa ją, a -e pozwala na jej edycję.

Położenie[edytuj | edytuj kod]

Tabele crona właściwe dla danych użytkowników znajdują się zwykle w katalogu /var/spool/cron/crontabs (np. jest tak w systemach HP-UX i Solaris, z kolei dystrybucja Linuksa RHEL i jej klony używają w tym celu /var/spool/cron).

Niektóre dystrybucje Linuksa mają dodatkową tabelę systemową umieszczoną w pliku /etc/crontab.[1] Od zapisów tam umieszczonych zależy sposób obsługi skryptów z katalogów /etc/cron.*:

/etc/cron.hourly  – skrypty wykonywane co godzinę
/etc/cron.daily   – skrypty wykonywane codziennie
/etc/cron.weekly  – skrypty wykonywane raz w tygodniu
/etc/cron.monthly – skrypty wykonywane raz w miesiącu

W powyższych katalogach należy umieścić plik ze skryptem do wykonania.

Przykład[edytuj | edytuj kod]

Przykładowa tabela crontab z systemu GNU/Linux właściwa dla danego użytkownika:

# Używaj /bin/sh do wywoływania komend. Nieważne co jest w /etc/passwd.
SHELL=/bin/sh
#
# Przesyłaj wyjście do użytkownika paul
MAILTO=paul
#
# Użyj następującej wartości zmiennej PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/paul/bin
#
# 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 dnia każdego miesiąca -- wyjście jest
# przesyłane do paula
15 14 1 * *      $HOME/bin/monthly
#
# Denerwuj Stefana od poniedziałku do piątku o godzinie 22:00
0 22 * * 1-5     echo "Stefanie, jest już 22:00. Gdzie są Twoje dzieci?!" | mail -s "Wybiła 22:00" stefan@example.com 

#
# Inne przykłady
23 0-23/2 * * *  echo "uruchamiaj 23 min po polnocy, 2, 4 ..., codziennie"
5 4 * * sun      echo "Uruchamiaj się 5 po 4 w niedziele"
0 10 * * 1,3     echo "Uruchamiaj się w każdy poniedzialek i srode o 10.00"
*/2 * * * *      echo "Uruchamiaj się co 2 minuty"

# z wykorzystaniem zapisu słownego ze znakiem "@"
@reboot          echo "System uruchomił się!"   # polecenie uruchamiane jednorazowo po uruchomieniu systemu
@yearly          echo "Minął kolejny rok!"      # odpowiednik zapisu "0 0 1 1 *"
@annually        echo "Minął kolejny rok!"      # j.w.
@monthly         echo "Minął kolejny miesiąc!"  # odpowiednik zapisu "0 0 1 * *"
@weekly          echo "Minął kolejny tydzień!"  # odpowiednik zapisu "0 0 * * 1"
@daily           echo "Minął kolejny dzień!"    # odpowiednik zapisu "0 0 * * *"
@midnight        echo "Minął kolejny dzień!"    # j.w.
@hourly          echo "Minęła kolejna godzina!" # odpowiednik zapisu "0 * * * *"

Pierwsza część pliku to definicje trzech zmiennych środowiskowych SHELL, MAILTO i PATH. Wartość zmiennej SHELL ustala powłokę w której cron będzie uruchamiał polecenia. Wartość zmiennej MAILTO określa użytkownika, któremu pocztą elektroniczną wysłany zostanie raport zawierający standardowy strumień wyjścia oraz standardowy strumień błędów, jeśli wykonywane polecenie umieści coś na jednym z nich. Zmienna PATH zawiera oddzielone dwukropkami ścieżki, których powłoka używa kolejno do odnalezienia plików wykonywalnych.

Druga część to już właściwa tabela zawierająca informacje o czasie uruchomienia i poszczególnych komendach dla każdego z zadań. W tej części linie nie będące komentarzem zawierają sześć kolumn. Pierwsze pięć określa czas uruchomienia zadania, szósta definiuje komendę, która ma zostać wykonana:

*     *     *     *     *  komenda do wykonania
^     ^     ^     ^     ^
|     |     |     |     |
|     |     |     |     +----- dzień tygodnia (0 - 7) (niedziela=0, poniedziałek=1, wtorek=2, ..., niedziela=7)
|     |     |     |     
|     |     |     +------- miesiąc (1 - 12)
|     |     |     
|     |     +--------- dzień miesiąca (1 - 31)
|     |     
|     +----------- godzina (0 - 23)
|     
+------------- minuta (0 - 59)

Uwagi:

  • W większości implementacji niedziela może być oznaczona jako 0 lub 7[2][3][4].
  • Aby uniknąć problemów z uruchomieniem poleceń systemowych, należy w crontabie podawać pełne ścieżki do nich lub ustawić odpowiednią wartość zmiennej PATH. Tak samo należy postąpić w przypadku skryptów, które są wywoływane przez cron.
  • Dzień wykonania komendy można określić na dwa sposoby: podając dzień miesiąca lub dzień tygodnia. Jeśli oba pola są ustawione, to komenda wykona się zarówno w podany dzień miesiąca, jak i w podany dzień tygodnia!
  • Wartości liczbowe możemy zapisywać w różnych formatach:
    • 1,2,5 – czyli wartości kolejno 1, 2 i 5
    • 1-3 – czyli wartości 1, 2 i 3 (kolejne liczby z zakresu)
    • 3-9/2 – czyli wartości 3, 5, 7 i 9 (co druga wartość z zakresu od 3 do 9)
    • */2 – co 2 dozwolona wartość (np. w pierwszej kolumnie będzie to 0, 2, 4, 6... 54, 56 i 58)
    • 1-3,5,6 – czyli 1, 2, 3 oraz 5 i 6
  • Tabela systemowa zawarta w pliku /etc/crontab posiada nieznacznie inną składnię: pierwsze pięć pól określa czas uruchomienia zadania, szóste pole określa nazwę użytkownika, z którego uprawnieniami zadanie zostanie uruchomione, siódme pole definiuje komendę, która zostanie wykonana.
  • Jako specjalny znak traktowany jest "%" (procent), który oznacza nową linię. Chcąc użyć znaku procenta literalnie, należy poprzedzić go znakiem "\"[5].
  • Przy zmianie czasu warto sprawdzić man jak cron sobie z tym radzi (lub inaczej ustawić zadania), ale najczęściej cron postępuje tak:
    • Przy zmianie poniżej 3 godzin (w tym zmianie na czas letni lub zimowy) czas jest ustawiany przez system od razu
    • Zadania ustawione co godzinę lub częściej uruchamiane są normalnie, bez zmian
    • Pozostałe zadania przy zmianie czasu do tyłu nie uruchomią się 2x (dodatkowe uruchomienie będzie pominięte)
    • Przy zmianie czasu do przodu zadania, które mogły zostać pominięte cron uruchomi od razu

Zobacz też[edytuj | edytuj kod]

Przypisy[edytuj | edytuj kod]

  1. Co to jest cron? Jak działa? Jak używać? [online], Jak Wybrać Hosting? [dostęp 2023-03-09] (pol.).
  2. crontab(5): tables for driving cron - Linux man page [online], linux.die.net [dostęp 2017-11-22] (ang.).
  3. crontab(1) — cron — Debian stretch — Debian Manpages [online], manpages.debian.net [dostęp 2017-11-22] (ang.).
  4. OpenBSD manual pages [online], www.openbsd.org [dostęp 2017-11-22].
  5. nfsec.pl - Używanie znaku % we wpisach crontab