46.DOC

(87 KB) Pobierz









Rozdział 46.
cron i at









E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\46.DOC              689










Rozdzia³ 46. ¨ cron i at              695

Tim Parker

W tym rozdziale:

u                                          Używanie programu cron             

u                                          Program at             

Automatyzowanie zadań administracyjnych jest jednym z warunków utrzymywania systemu w dobrej kondycji. Jeśli wszystkie zadania będą wykonywać się same, bez Twojej interwencji, w tle, administrowanie stanie się samą przyjemnością. Z tego właśnie powodu powstały programy cron i at. Oba pozwalają na uruchamianie programów o zadanej godzinie, bez interwencji użytkownika czy administratora.

Używanie programu cron

Program cron (jego nazwa jest skrótem angielskiego słowa chronograph) pozwala na automatyczne wykonywanie poleceń przez system o określonej godzinie. W tym celu jest on ładowany do pamięci jako program rezydentny podczas uruchamiania systemu (zwykle z jednego ze skryptów rc). Podczas działania odczytuje on dane o programach, które ma wykonać, i porach ich uruchomienia z pliku crontab.

Za każdym razem, gdy dane o dniu i godzinie wykonania programu zgadzają się z czasem systemowym, wykonywane jest odpowiednie polecenie. Jeśli następnego dnia czas wykonania zadania znów zgadza się z czasem systemowym, odpowiedni program ponownie zostanie wykonany. Jest to idealne wręcz rozwiązanie do takich zadań, jak tworzenie codziennych kopii zapasowych, aktualizacja baz danych czy „sprzątanie” w systemie plików (usuwanie zbędnych plików tymczasowych, plików, w których rejestrowane są pewne zdarzenia itd.). Cykl jest powtarzany aż do zakończenia działania programu cron lub wprowadzenia odpowiednich zmian do pliku crontab.

W większości systemów dostęp do programu cron ma tylko administrator. Taka sytuacja może zostać zmieniona przez wprowadzenie odpowiednich wartości do dwóch plików: /usr/lib/cron/cron.allow, który zawiera identyfikatory użytkowników mogących korzystać z tego polecenia, i /usr/lib/cron/cron.deny, z listą użytkowników nie mogących tego robić. W obu plikach identyfikatory użytkowników (odpowiadające tym zapisanym w pliku /etc/passwd) powinny być wpisywane po jednym w każdym wierszu.

Jeśli nie istnieje żaden z tych plików, tylko użytkownik root może używać programu cron. Jeśli chcesz, aby mogli go używać wszyscy użytkownicy, utwórz pusty plik /usr/lib/ cron/cron.deny (w niektórych systemach /var/cron.d/cron.deny). Plik /usr/lib/ cron/cron.deny zawierający następujące dane:

 

bill
tom

spowoduje, że użytkownicy bill i tom nie będą mieli możliwości użycia programu cron, natomiast możliwość taką będą mieli wszyscy pozostali użytkownicy. Jeśli taką samą zawartość miałby plik /usr/lib/cron/cron.allow, tylko użytkownicy bill i tom (oraz oczywiście root) mieliby możliwość korzystania z tego programu.

 

Możesz się zastanawiać, jaki sens ma używanie programu cron, skoro można zawsze odpowiednie polecenie wpisać ręcznie. To prawda, ale po pierwsze musisz o tym pamiętać, a po drugie musisz być na miejscu. Program cron umożliwia zautomatyzowanie wszystkich codziennych czynności administracyjnych. Dzięki temu nie musisz codziennie wydawać długiej listy poleceń tworzących kopie zapasowe, usuwających niepotrzebne pliki itd.

Tworzenie pliku crontab

Jeśli chcesz zrzucić na program cron codzienne obowiązki, powinieneś użyć programu crontab. Odczytuje on dane o procesach, które należy uruchamiać, z pliku, który najczęściej również nazywa się crontab. Program ten potrafi również wyświetlić listę zadań, usunąć ją czy dodać do niej nowe zadania.

Program crontab posiada opcję pozwalającą jako plik z danymi wykorzystać plik o dowolnej nazwie. Domyślnie odczytywany jest plik o nazwie crontab znajdujący się w katalogu bieżącym.

Instrukcje zawarte w pliku crontab mają prostą strukturę, choć przyzwyczajenie się do niej trwa chwilę. Każdemu procesowi odpowiada jeden wiersz o następującym formacie:

minuta godzina dzień_miesiąca miesiąc_roku dzień_tygodnia polecenie

Oto przykładowe wpisy:

 

20 1 * * * /usr/bin/calendar –
0 2 * * * /bin/organize_data

Każdy wiersz składa się z sześciu pól, rozdzielonych znakiem tabulacji lub spacją. Są to kolejno:

minuta               dostępne wartości: 0 – 59;

godzina               dostępne wartości 0 – 23;

dzień_miesiąca               dostępne wartości 1 –31;

miesiąc_roku               dostępne wartości 1 – 12;

dzień_tygodnia               dostępne wartości 0 – 6 (0 = niedziela, 1=poniedziałek itd.);

polecenie              program, który ma zostać wykonany o danej godzinie w danym dniu.

Dzięki takiemu formatowi możliwe jest dokładne określenie, kiedy dany proces ma zostać uruchomiony. Aż pięć kategorii określających czas wykonania pozwala bardzo dokładnie określić porę wykonania, nawet jeśli wymagane są terminy nie układające się w żaden regularny schemat.

Ostatnie pole zawiera nazwę skryptu, który ma zostać uruchomiony. Taki skrypt może składać się tylko z jednego polecenia, ale może również być całkiem skomplikowanym programem, zawierającym odwołania do innych skryptów i programów. Ważne jest podawanie pełnych ścieżek dostępu do skryptów (bez względu na to, czy katalogi w których są one zapisane wchodzą w skład ścieżki przeszukiwania), ponieważ cron nie dziedziczy środowiska użytkownika, w związku z czym nie będzie potrafił odszukać odpowiednich poleceń. Musisz również posiadać uprawnienia do wykonania określonego programu, cron bowiem wykonuje proces tak, jakbyś to Ty go uruchomił.

W polach oznaczających czas mogą znaleźć się pojedyncze liczby z dozwolonego zakresu, lista liczb rozdzielonych przecinkami, dwie liczby rozdzielone minusem (oznaczające zakres, np. 1 – 5) lub gwiazdka, oznaczająca wszystkie dostępne wartości.

Spójrzmy na przykładową zawartość pliku crontab:

 

20 1 * * * /usr/bin/calendar –
0 2 1 * 0 /bin/organize_data

10,30,50 9-18 * * * /bin/setperms

Pierwsze polecenie, /usr/bin/calendar – (myślnik jest częścią polecenia), będzie wykonane 20 minut po pierwszej w nocy każdego dnia tygodnia we wszystkie tygodnie roku. Gwiazdka oznacza wszystkie dostępne wartości.

O drugiej w nocy w każdą niedzielę (0 w piątej kolumnie) i pierwszego dnia miesiąca (1 w trzeciej kolumnie) wykonane zostanie polecenie /bin/organize_data. Oczywiście jeśli pierwszego wypada w niedzielę, polecenie zostanie wykonane tylko raz.

Trzecie polecenie, /bin/setperms, wykonywane będzie 10, 30 i 50 minut po każdej godzinie pomiędzy 9 i 18, każdego dnia tygodnia.

Wpisy w pliku crontab mogą mieć dowolną kolejność, ale dane o każdym z programów muszą zawierać sześć pól i znajdować się w osobnym wierszu. Jeśli do pliku wkradnie się jakiś błąd, cron poinformuje Cię o jego istnieniu pocztą (może to być dość uciążliwe, jeśli pomylisz się w poleceniu, które ma być wykonywane często, ponieważ przy każdej próbie uruchomienia błędnego polecenia cron wygeneruje nową informację, co może doprowadzić nawet do przepełnienia skrzynki pocztowej).

Plik zawierający zadania najlepiej przechowywać we własnym katalogu pod nazwą crontab, chyba że potrzebujesz kilku jego wersji – wybór używanych nazw zależy wówczas wyłącznie od Ciebie.

Zarządzanie plikami crontab

Po stworzeniu własnego pliku crontab powinieneś poinformować program cron, że należy go przetworzyć. Jego kopia znajdzie się wówczas w katalogu systemowym, zwykle /usr/spool/cron/crontabs. Plik będzie miał nazwę zgodną z identyfikatorem użytkownika, który zamówił wykonanie danych zadań (na przykład plik zawierający dane o poleceniach zleconych przez użytkownika bill może nazywać się /usr/spool/ cron/crontabs/bill).

Aby uaktywnić plik crontab, wydaj polecenie crontab, podając jako argument wywołania nazwę pliku, w którym zapisane są odpowiednie dane, na przykład tak:

 

crontab crontab

Jeśli wcześniej wydałeś już takie polecenie, wszystkie zlecenia są anulowane, a w ich miejsce wstawiane są nowe.

 

Aby zmodyfikować zamówione zadania, powinieneś edytować plik crontab i nakazać jego ponowne przetworzenie. Nigdy nie należy modyfikować bezpośrednio plików w katalogu /usr/spool/cron/ crontabs.

Jeśli chcesz sprawdzić, jakie programy będą uruchamiane przez program cron, możesz użyć polecenia crontab z opcją –l (ang. list):

 

crontab –l

Polecenie to powoduje wyświetlenie zawartości pliku o nazwie odpowiadającej Twojemu identyfikatorowi użytkownika, zapisanego w katalogu

 

/usr/spool/cron/crontabs.

Jeśli chcesz usunąć swój plik nie zastępując go żadnym innym, użyj opcji –r (ang. remove):

 

crontab –r

Polecenie crontab pozwala również edytować plik, który aktualnie jest używany (uruchamiany jest edytor domyślny, którego nazwa jest zdefiniowana przez wartość odpowiedniej zmiennej środowiskowej – zwykle edytor vi):

 

crontab –e

Po zakończeniu edycji i zapisaniu pliku jest on automatycznie przetwarzany przez program cron.

Zmiany w plikach crontab są zwykle wprowadzane w życie w ciągu pięciu minut – przynajmniej tak często są odczytywane te pliki (w większości systemów odbywa się to co minutę). Oznacza to również, że wykonanie danego programu może się opóźnić o kilka minut; nie można zakładać, że zostanie on uruchomiony punktualnie. Im większe jest obciążenie systemu, tym większe mogą być opóźnienia.

W niektórych systemach administrator ma możliwość monitorowania wszystkich czynności podejmowanych przez program cron – w tym celu należy zmodyfikować plik /etc/default/cron. Powinien się w nim znajdować wpis definiujący wartość zmiennej CRONLOG – ustaw tę wartość na YES, a wszystkie wywołania programów zostaną odnotowane w pliku /usr/lib/cron/log. Nie we wszystkich wersjach Linuxa rozwiązanie takie jest dostępne. Powinieneś jednak używać go z rozwagą, ponieważ taki plik może szybko osiągnąć duże rozmiary.

Bardziej złożone polecenia

Plik crontab może zawierać dowolne polecenia poprawnie rozpoznawane przez interpreter poleceń powłoki. Problemem czasem staje się jednak fakt, że niektóre z nich generują jakieś informacje, które są następnie przesyłane pocztą do użytkownika, co może spowodować zablokowanie skrzynki pocztowej. Jeśli przewidujesz, że polecenie uruchamiane przez program cron będzie generowało jakieś komunikaty, powinieneś wyjście programu i komunikaty o błędach skierować do pliku lub, jeśli generowane informacje Cię nie interesują, do urządzenia /dev/null albo /dev/zero, na przykład tak:

 

0 * * * * date > /tmp/test1 2 > /dev/null

Powyższe polecenie co godzinę przepisuje aktualną datę do pliku /tmp/test1, komunikaty o błędach wysyłając do urządzenia /dev/null (co oznacza po prostu ich zignorowanie). Możesz również komunikaty o błędach skierować gdzieś indziej, na przykład:

 

30 1 * * * cat /home/reksio/chapt* > /home/reksio/safe/backup 2> å/home/reksio/cos_nie_tak

Powyższe polecenie powoduje, że pliki o nazwach rozpoczynających się od chapt w katalogu /home/reksio będą łączone w jeden plik o nazwie backup zapisany w katalogu /home/reksio/safe, a komunikaty o ewentualnych problemach przesyłane będą do pliku cos_nie_tak.

Oto inny przykład użycia programu cron, wykorzystujący mechanizm potoków (ang. pipe):

 

0 1 * * * sort –u /tmp/userlist | mail –s"dzisiejsi uzytkownicy" root

Powoduje on wysyłanie do użytkownika root poczty zawierającej listę użytkowników, którzy logowali się danego dnia (przy założeniu, że taka lista znajduje się w pliku o nazwie /tmp/userlist). Lista ta jest posortowana i wyeliminowane są pozycje powtarzające się (opcja –u programu sort – ang. unique).

Należy pamiętać, że domyślnie do przetwarzania poleceń używany jest interpreter bash, możesz więc spotkać się z problemami próbując wykonać polecenia powłoki csh.

Program at

Program at jest dość podobny do programu cron, z tym że zadane polecenie wykonuje nie okresowo, ale tylko raz. Jego składnia jest następująca:

 

at czas [data] <plik

Większość parametrów może być podana na kilka sposobów. Na przykład czas można podać w postaci pełnej (18:43), podać tylko godzinę (10) bądź użyć modyfikatorów am i pm.

W polu czasu rozpoznawanych jest również kilka wyrazów, takich jak noon, midnight, now, next i zulu (konwersja na czas GMT). Niektóre wersje nie rozpoznają wyrazu now.

Pole daty jest opcjonalne. Jego zawartość może stanowić angielska nazwa miesiąca i dzień (np. May 10) lub dzień tygodnia (pełna nazwa angielska lub skrócona, trzylit...

Zgłoś jeśli naruszono regulamin