Rozdział 46.
cron i at
Tim Parker
W tym rozdziale:
Używanie programu cron
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, trzyliterowa). Można także podać rok, ale rzadko jest to konieczne. Tu również rozpoznawanych jest kilka słów, takich jak today i tommorow (choć podawanie słowa today jest zbędne, ponieważ polecenia domyślnie wykonywane są w tym dniu, w którym zostały wydane).
Plik wejściowy może zawierać dowolne polecenia. Można również wprowadzić je „ręcznie” - kombinacja klawiszy Control+D kończy wprowadzanie poleceń z klawiatury.
Załóżmy, że w Twoim katalogu znajduje się skrypt o nazwie reorg.data (i masz prawo go wykonać) o następującej zawartości:
/home/reksio/setperms
/home/reksio/sort_database
/home/reksio/index_database
/home/reksio/cleanup
Chciałbyś zapisane w nim polecenia wykonać o 8:30, ale nie będzie Cię wtedy przy komputerze. Aby rozwiązać ten problem, możesz wydać jedno z poleceń:
at 20:30 < reorg.data
at 8:30 pm <reorg.data
at 20:30 today <reorg.data
Jeśli chciałbyś, żeby skrypt został wykonany w piątek, wydaj jedno z poleceń:
at 8:30 pm Friday < reorg.data
at 20:30 Fri < reorg.data
Niektóre wersje programu at są jeszcze sprytniejsze i rozpoznają konstrukcje takie jak:
at 0900 Monday next week <reorg.data
Po zleceniu wykonania polecenia otrzymasz jego identyfikator:
at 6 <zrob_cos
job 54342.a at Wed Aug 31 06:00:00 EDT 1997
W tym przypadku identyfikatorem jest 54342.a. Identyfikator ten określa jednoznacznie zadanie. Jest on wymagany np. do odwołania wydanego polecenia.
Listę wszystkich zleconych zadań można obejrzeć za pomocą polecenia atq lub, w innych systemach, opcji -l programu at:
$ at -l
user = reksio job 54342.a at Wed Aug 31 06:00:00 EDT 1997
user = reksio job 54343.a at Wed Aug 31 09:30:00 EDT 1997
Jeśli chcesz anulować zlecenie, wydaj polecenie at z opcją -r i numerem identyfikacyjnym zadania:
at -r 54343.a
Linux nie potwierdzi usunięcia zadania, aby sprawdzić, czy wszystko przebiegło pomyślnie, trzeba jeszcze raz wydać polecenie wyświetlające listę oczekujących na wykonanie poleceń. Anulować można wykonanie tylko tych zadań, których jesteś właścicielem (ograniczenie to nie dotyczy użytkownika root). W niektórych wersjach systemu do usuwania zadań z kolejki służy polecenie atrm.
Dane o zadaniach programu at są przechowywane w katalogu /usr/spool/cron/ atjobs, w plikach o nazwach odpowiadających identyfikatorom zadań. Podobnie jak miało to miejsce w przypadku polecenia cron, do limitowania dostępu do polecenia at służą pliki at.deny i at.allow, przechowywane w katalogu /usr/lib/cron lub /etc/cron.d. Jeśli chcesz umożliwić wszystkim użytkownikom używanie programu at, utwórz pusty plik o nazwie at.deny.
Komunikaty generowane przez wykonywane programy i komunikaty o błędach wysyłane są pocztą do użytkownika, chyba że zostaną skierowane do pliku. Polecenie at, w przeciwieństwie do cron, dziedziczy po użytkowniku środowisko, więc nie musisz aż tak martwić się o ścieżki dostępu. Jeśli zajrzysz do plików zapisanych w katalogu /usr/spool/cron/atjobs, zobaczysz, że przed właściwym poleceniem znajdują się definicje wszystkich zmiennych środowiskowych używanych w momencie wydawania polecenia at.
Podsumowanie
Jak widać, programy cron i at są łatwe w użyciu. Są one niezastąpione do automatyzacji prac administracyjnych, takich jak porządkowanie baz danych, usuwanie plików, w których rejestrowane są czynności systemu, usuwanie plików tymczasowych czy tworzenie kopii zapasowych. Nie zrobią za Ciebie wszystkiego, ale możesz kazać im zajmować się wszystkimi powtarzającymi się czynnościami.
Wiele systemów linuxowych posiada pewną liczbę przykładowych plików cron, które pomogą Ci zorientować się w możliwościach tkwiących w tym programie. Użyj ich jako punktu wyjścia do tworzenia własnych plików, wyręczających Cię z codziennych obowiązków.
Tworzenie kopii zapasowych, czyli podstawowe zadanie każdego administratora, omówione jest w rozdziale 45. „Kopie zapasowe”.
Jak założyć i skonfigurować węzeł internetowy w oparciu o system Linux, dowiesz się z rozdziału 47. „Konfigurowanie węzła internetowego”.
O aplikacjach, których można używać w systemie Linux, przeczytać możesz w rozdziałach od 62. „Adabas-D i inne bazy danych” do 64. „Program Lone Tar”.
694 Część VI ♦ Linux dla administratorów
694 E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\46.DOC
E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\46.DOC 689
Rozdział 46. ♦ cron i at 695