Ładowanie Ładowanie

Artykuł > Cron, czyli zadania na czas

strony: 1 | 2 | 3 następna »
wydrukuj: print publikuj: wykop dodaj do flakera Dodaj jako nius na OSnews.pl! delicious

Cron, czyli zadania na czas

TAGI: cron , harmonogram , linux , unix
2007-11-23 07:25:00 | Cezary M. Kruk
Cron, czyli zadania na czas

Pewne zadania w systemie wykonuje się periodycznie i bez udziału użytkownika, naturalna jest więc chęć przerzucenia na maszynę odpowiedzialności za ich wykonanie. W Linuksach i Uniksach zrobimy to za pomocą programu cron. Całą sztuką jest taka konfiguracja jego demona crond, która umożliwi osiagnięcie założonych celów i ominięcie związanych pułapek podczas definiowania jego parametrów pracy. W pierwszej części niniejszego artykułu opiszemy, w jaki sposób tworzymy listy zadań w plikach crontab.

Drugą z kolei poświęcimy na omówienie skryptu, który sam sprawdzi, czy przypadkiem nie mamy ostatniego dnia miesiąca i w razie potrzeby uruchomi stosowne polecenia. Taką sytuację trzeba rozważyć osobno, bo o ile uruchamianie zadań np. w piętnastym dniu miesiąca nie nastręcza większych trudności, to z ostatnim dniem nie jest tak łatwo: może on przypadać równie dobrze dwudziestego ósmego, jak i trzydziestego pierwszego.

Ostatnia część artykułu jest poświęcona uruchamianiu zadań w systemach, które nie pracują non stop i tym samym mogą zignorować część poleceń crona. Najbardziej narażone na pominięcie są wpisy dzienne, tygodniowe i miesięczne. Do realizacji takich prac służył kiedyś program anacron, ale zaprzestano jego rozwoju i dziś próba skompilowania go kończy się niepowodzeniem. Dlatego pokażemy, jak można go symulować za pomocą crona wykorzystując odpowiednie wpisy w crontabie.

Pliki crontab

Cron jest programem służącym do periodycznego uruchamiania poleceń lub skryptów. Crontab to natomiast aplikacja do zarządzania plikami zawierającymi reguły dla crona. Pliki te nazywa się niekiedy tabelami, bo umieszczane w nich poszczególne wpisy mają tę samą strukturę: składają się z sześciu pól oddzielonych spacjami lub tabulatorami – pięciu z określeniami czasu wykonania danego polecenia oraz szóstego zawierającego już samo polecenie. Każdy użytkownik może mieć taki indywidualny plik z własnym zestawem reguł. Crond to uniksowy demon, który budzi się co minutę, czyta reguły z plików crontab i w razie potrzeby uruchamia stosowne polecenia.

Demon crond pracuje w tle i wykonuje zadania zlecone mu w plikach z katalogu /var/spool/cron/crontabs. Każdy użytkownik może mieć tam swój indywidualny plik z zadaniami (jego nazwa jest taka sama jak nazwa konta tego użytkownika).

Wspomniany demon przegląda swe listy zadań na początku każdej minuty. Są one przechowywane w pamięci i mogą liczyć nawet tysiące pozycji. Inaczej ma się sprawa z długością pojedynczego wpisu – nie powinien on przekroczyć 1024 znaków. Nic nie stoi jednak na przeszkodzie, aby zlecać demonowi wykonywanie uprzednio przygotowanych skryptów, które mogą być dowolnie długie.

Informacje o zadaniach zleconych cronowi przez danego użytkownika są przechowywane w pliku /var/spool/cron/crontabs/użytkownik. Przejrzymy je, wydając polecenie crontab -l, a zmienimy po wydaniu polecenia crontab -e. Ta ostatnia komenda uruchamia edytor vi z otworzonym do edycji właściwym dla danego użytkownika plikiem crontab. Inną metodą modyfikacji listy zadań jest wczytanie jej z pliku poleceniem crontab plik. W takim przypadku zadania z pliku zastąpią te, które były dotychczas zarejestrowane w crontabie. Tę metodę modyfikowania zadań crona polecamy użytkownikom niekorzystającym z programu vi na co dzień. Nie zaleca się natomiast bezpośredniego modyfikowania listy zadań crona z wykorzystaniem popularnych edytorów, bo w takim przypadku demon crond nie jest powiadamiany o tym, że lista ta uległa zmianie, i uwzględnia nowe zadania dopiero po kolejnym uruchomieniu systemu. Polecenie crontab -d powoduje usunięcie pliku crontab, którego właścicielem jest dany użytkownik.

Program crontab ma przypisany bit SUID, dzięki czemu każdy użytkownik systemu może zlecać demonowi crond własne zadania. Jeżeli ze względów bezpieczeństwa systemu pozbawiamy poszczególne programy bitu SUID, a nie chcemy odbierać użytkownikom dostępu do crona, możemy zarejestrować ich wszystkich w pliku konfiguracyjnym programu sudo, czyli w /etc/sudoers, lub założyć specjalną grupę dla tych, którzy mają mieć dostęp do crontaba, i przypisać tę grupę programowi crontab.

W zadaniach zlecanych cronowi możemy w razie potrzeby odwoływać się do przejmowanych z powłoki trzech zmiennych globalnych, w ramach której program ten został uruchomiony: $USER, $HOME oraz $SHELL.

Cron przejdzie powtórnie do zadania wykonywanego periodycznie dopiero wówczas, gdy poprzedni proces zostanie zakończony. Jeżeli jakieś zadanie zabiera mu półtorej minuty, to, mimo że każemy cronowi uruchamiać je raz na minutę, będzie on w stanie zrobić to jedynie co dwie minuty, chyba że zlecone zadanie będzie wykonywane w tle.

Zlecenia dla crona

Pojedyncze zlecenie dla crona ma postać:

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

Nie wszystkie pola muszą przyjmować jakieś określone wartości – gwiazdka oznacza wartość dowolną. Najprostszy wpis w crontabie ma postać:

* * * * * polecenie

Spowoduje on, że nasze polecenie będzie wykonywane w każdej minucie każdej godziny każdego dnia.

Często wykorzystuje się tak określone zadanie do monitorowania poprawności pracy demona crond poprzez umieszczenie w /var/spool/cron/crontabs/root zlecenia:

* * * * * touch /tmp/.crond_running

W rezultacie czas utworzenia pliku /tmp/.crond_running powinien się zmieniać co minutę, co będzie świadczyło o tym, że crond jest aktywny i wykonuje zadania z /var/spool/cron/crontabs.

Podajmy jeszcze kilka przykładów:

0 * * * * polecenie1

30 8 * * * polecenie2

55 23 31 * * polecenie3

0 0 1 jan * polecenie4

30 15 * * mon-fri polecenie5

*/15 * * * * polecenie6

0 8-16/2 * * * polecenie7

0 12 * * mon,wed,fri polecenie8

* * * * 0 /usr/local/bin/skrypt

Pierwsze polecenie będzie wykonywane o każdej pełnej godzinie, drugie codziennie o 8.30, trzecie każdego 31. dnia miesiąca o 23.55, czwarte pierwszego stycznia o północy, piąte w dni robocze o 15.30, szóste co kwadrans, siódme co dwie godziny między ósmą a szesnastą, ósme w wybranych dniach w południe, a dziewiąte będzie uruchamiało wskazany skrypt co minutę w każdą niedzielę.

Zamiast podawać skróty nazw dni tygodnia, możemy stosować wartości liczbowe z zakresu 0–6, pamiętając przy tym, że tydzień zaczyna się od niedzieli, wyrażonej liczbowo jako 0. Taka właśnie wartość została wpisana w polu dnia tygodnia w naszym ostatnim przykładzie.

Jeżeli użytkownik tworzący przytoczony tu plik crontab chciał, aby trzecie z kolei polecenie było uruchamiane ostatniego dnia każdego miesiąca, to nie osiągnie on swego celu w ten sposób, ponieważ nie każdy miesiąc liczy trzydzieści jeden dni. W tym przypadku trochę lepszym rozwiązaniem byłoby zadanie zlecenia:

55 23 28,29,30,31 * * polecenie3

Jego wadą jest jednak to, że spowoduje ono wykonanie tego polecenia nie tylko każdego ostatniego , ale także przedostatniego dnia miesiąca (oprócz lutego w roku nieprzestępnym).

W niektórych Uniksach używa się ponadto tabeli systemowej zawartej w pliku /etc/crontab. Poszczególny wpis w tym pliku składa się z siedmiu pól: pięciu z określeniem czasu wykonania polecenia, szóstego z nazwą użytkownika, w imieniu którego polecenie jest uruchamiane, oraz z siódmego z treścią polecenia.

Najnowsze wiadomości

reklama

strony: 1 | 2 | 3 następna »
wydrukuj: print publikuj: wykop dodaj do flakera Dodaj jako nius na OSnews.pl! delicious

Czytaj webhosting.pl:

Dyskusja

dodaj komentarz
0 + -
comnt #01 Hyuio 2009-04-24 16:04:18
Hyuio Hm a jeśli chce wykonać polecenie 23 i 24 dnia m-ca to piszę 23,24 tak?
------------------
Browser: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7

Komentarze

  • Aby dodać komentarz, musisz podać swój nick, treść komentarza oraz poprawnie przepisać oba słowa z obrazka (słowa muszą być rozdzielone spacją).
  • Jeśli masz problemy z odczytaniem słów, zmień zdjęcie.
  • Używamy tego zabezpieczenia, ponieważ dzięki niemu rozwija się projekt reCAPTCHA. Sugerujemy jednak, by zarejestrować się w serwisie i w ten sposób ominąć konieczność ciągłego odczytywania wyrazów.
  • W treści komentarza można używać języka formatowania BBcode.