Bociek PLD - Pisarz
I. Informacje podstawowe
II. Instalacja
III. Podręcznik użytkownika
IV. Podręcznik administratora
Usługi dostępne w PLD
CRON - Cykliczne wykonywanie zadań
V. Tworzenie PLD - Praktyczny poradnik
VI. O podręczniku
O tej książce
Spis treści
Inne wersje tego dokumentu
PDF
HTML (jeden plik)
TXT
Odnośniki
Tworzymy dokumentację PLD
Strona PLD
Listy dyskusyjne PLD

CRON - Cykliczne wykonywanie zadań

<- ->
 

CRON jest ważnym demonem systemowym, którego zadaniem jest uruchamianie programów cyklicznie lub o określonej porze. Omówiona zostanie instalacja vixie-cron, który oprócz standardowych usług posiada dodatkowe opcje konfiguracyjne i zwiększone bezpieczeństwo

Instalacja

Program instalujemy za pomocą poldka:

# poldek -i vixie-cron

Po zainstalowaniu program jest praktycznie gotowy do użycia. Można więc od razu uruchomić demona korzystając z polecenia:

# /etc/rc.d/init.d/crond start

Od tej pory demon może działać nieprzerwane - nie wymaga restartów po rekonfiguracji.

Budowa tabel

W cronie istnieje podział na zadania systemowe i zadania użytkowników. Pierwszych zwykle używa się do prac administracyjnych, z drugich korzystają użytkownicy wedle własnych potrzeb (o ile mają do tego prawo). Główna konfiguracja demona (systemowa) umieszczona jest w pliku /etc/cron.d/crontab, konfiguracje lokalne użytkowników przechowywane są w plikach /var/spool/cron/{$login}. O ile /etc/cron.d/crontab może być swobodnie modyfikowany za pomocą edytora tekstu, o tyle użytkownicy powinni używać w tym celu odpowiedniego narzędzia (opisanego w dalszej części).

Pliki konfiguracji crona nazywane są tabelami, zarówno główny plik konfiguracji jak i konfiguracje użytkowników mają bardzo podobną budowę. Są to pliki tekstowe o ściśle ustalonej składni, w których jeden wiersz odpowiada jednemu zadaniu. Wiersz tabeli systemowej ma następującą składnię:

{$data-czas} {$użytkownik} {$zadanie}

Nieco prostszą budowę mają tabele użytkowników:

{$data-czas} {$zadanie}

Pierwsze pole określa jak często wykonywane jest zadanie, pole {$użytkownik} występuje jedynie w konfiguracji globalnej (w /etc/cron.d/crontab) i wskazuje z jakimi prawami uruchamiane ma być zadanie. Trzecie pole to operacja która ma być wykonywana. W tabelach użytkowników nie podaje się nazwy użytkownika, gdyż polecenia tam zawarte są automatycznie wykonywane z prawami ich właściciela.

Przykładowe zadania w /etc/cron.d/crontab:

02 01 * * *    root    find /home -size +100M > /root/duze_pliki.txt

Przykładowa konfiguracja zwykłego użytkownika:

30 * * * *    backup.sh

W tabelach oprócz zadań możemy definiować zmienne środowiskowe np.:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=jakis_user
NICE=15

Pierwsza zmienna wskazuje powłokę (zamiast domyślnej /bin/sh), która ma być używana do wywoływania zadań, druga to ścieżka do plików wykonywalnych. Trzecie pole to konto użytkownika do którego będą wysyłane powiadomienia pocztą elektroniczną lub pełny adres e-mail, ostatnia zmienna to priorytet wykonywanych zadań (liczba nice).

Format daty i czasu

Sekcja {$użytkownik} i {$zadanie} nie wymagają komentarza więc opisane zostanie jedynie pole {$data-czas}. Pole to składa się z pięciu kolumn:

  • 1-sza kolumna (zakres 0-59) oznacza minuty.

  • 2-ga kolumna (zakres 0-23) oznacza godzinę.

  • 3-cia kolumna (zakres 0-31) oznacza dzień miesiąca.

  • 4-ta kolumna (zakres 0-12) oznacza miesiąc. (0 i 1 to styczeń)

  • 5-ta kolumna (zakres 0-7) oznacza dzień tygodnia (0 i 7 to niedziela)

  • 6-ta kolumna określa komendę jaka powinna zostać wykonana dla danego wiersza.

Gwiazdka "*" oznacza cały zakres z możliwego przedziału. Same zakresy w pierwszych pięciu kolumnach mogą być reprezentowane w różny sposób. Więcej szczegółów na ten temat dowiemy się wywołując polecenie man 5 crontab

Program vixie-cron posiada także mało udokumentowany format wykonywania poleceń

Nazwa          Działanie
------         -------
@reboot        Uruchom jeden raz przy starcie systemu
@yearly        Uruchom jeden raz w roku, "0 0 1 1 *"
@annually      To samo co @yearly
@monthly       Uruchom jeden raz w miesiącu, "0 0 1 * *"
@weekly        Uruchom jeden raz w tygodniu, "0 0 * * 0"
@daily         Uruchom jeden raz dziennie, "0 0 * * *"
@midnight      To samo co @daily
@hourly        Uruchom raz na godzinę, "0 * * * *"

Przykład:

@reboot        /usr/bin/rdate -s ntp.task.gda.pl

Tabele systemowe

Główną konfigurację systemu tworzymy za pomocą naszego ulubionego edytora tekstu, poprzez modyfikację pliku /etc/cron.d/crontab. Jego zawartość będzie podobna do poniżej przedstawionego przykładu:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=admin@foobar.foo
NICE=15

# run-parts
01 * * * *       root  /bin/run-parts /etc/cron.hourly
02 1 * * *       root  /bin/run-parts /etc/cron.daily
02 2 * * 0       root  /bin/run-parts /etc/cron.weekly
02 3 1 * *       root  /bin/run-parts /etc/cron.monthly
0-59/10 * * * *  root  /bin/run-parts /etc/cron.10min		
15 18 * * 1-5    root  /bin/run-parts /etc/cron.gielda

Poniżej napisu # run-parts umieszczone są konfiguracje zadań, pierwsze cztery linijki stanowią domyślną konfigurację demona. Program run-parts służy do uruchamiania o jednej porze wszystkich programów we wskazanym katalogu. Dzięki takim opcjom możemy dodawać programy lub skrypty do odpowiednich katalogów bez konieczności pisania regułek cron-a. Poniżej umieszczono opisy powyższych przykładów:

Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.hourly codziennie, co godzinę - zaczynając od pełnej pierwszej minuty (np. 02:01, 03:01 itd.):

01 * * * *      /bin/run-parts /etc/cron.hourly

Wykonanie poleceń zawartch w pliku (plikach) katalogu /etc/cron.daily raz dzienie (o godz. 01:02):

02 1 * * *      /bin/run-parts /etc/cron.daily

Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.weekly raz w tygodniu (w niedziele o godz. 02:02):

02 2 * * 0      /bin/run-parts /etc/cron.weekly

Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.monthly raz na miesiąc (w pierwszy dzień miesiąca o godz. 03:02):

02 3 1 * *      /bin/run-parts /etc/cron.monthly

Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.gielda raz dziennie w dni robocze (od poniedziałku do piątku o godz. 18:15):

15 18 * * 1-5   /bin/run-parts /etc/cron.gielda

Wykonanie poleceń zawartych w pliku (plikach) katalogu /etc/cron.10min co 10 minut (każdego dnia, zaczynając od pełnej godziny - czyli np. 01:00, 01:10, 01:20 itd.):

0-59/10 * * * * /bin/run-parts /etc/cron.10min

Tabele użytkowników

Domyślnie użytkownicy nie mogą tworzyć własnych zadań cron-a, aby im na to zezwolić każdy nich musi zostać dopisany do pliku /etc/cron/cron.allow.

Użytkownicy powinni używać narzędzia crontab, program ten pozwala na bardzo łatwe zarządzanie tabelą użytkownika. Przyjmuje parametry określające rodzaj działania, które ma być wykonane na tabeli. Polecenie crontab -l wyświetla listę zdefiniowanych zadań, wywołanie crontab -e otworzy plik konfiguracji do edycji, zaś crontab -r usunie całą zawartość konfiguracji użytkownika.

Wybranie opcji edycji tabeli spowoduje otworzenie edytora tekstu określonego zmienną środowiskową EDITOR, po skończonej edycji plik zostanie automatycznie poddany kontroli poprawności i zapisany jako /var/spool/cron/{$login}. Najczęściej popełniane błędy przez użytkowników to zły format daty/czasu lub brak znaku nowej linii po ostatnim wierszu.

Root ma dodatkowo do dyspozycji możliwość zarządzania zadaniami dowolnego użytkownika, w tym celu stosuje się opcję -u z podaną nazwą użytkownika.

Komunikaty cron-a

Cron rejestruje wszystkie swoje prace do pliku /var/log/cron za pośrednictwem demona syslogd, dodatkowo można wskazać adres e-mail, na który mają docierać informacje o wystąpieniu błędów w wykonywaniu zadań. Jeśli nie zdefiniuje zmiennej MAILTO w tabeli to poczta zostanie wysłana na lokalne konto właściciela tej tabeli. Poczta elektroniczna jest jedyną formą informowania zwykłych użytkowników o ewentualnych błędach zadań, gdyż nie mają oni dostępu do logów.

Wysyłanie poczty elektronicznej zarówno do użytkowników lokalnych jak i zewnętrznych będzie wymagało instalacji lokalnego serwera poczty MTA. Może to być niemal dowolny demon pocztowy, np.: Exim (opis w tym dokumencie) lub Postfix (opis w tym dokumencie).

Aby łatwiej było analizować problemy, do wiadomości wysyłanej przez demon, dodawane są nagłówki X-Cron-Env, zawierające dane środowiska np.:

X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/sbin:/bin:/usr/sbin:/usr/bin>
X-Cron-Env: <MAILTO=root>
X-Cron-Env: <NICE=15>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>

 
&lt;- ->