poniedziałek, 16 sierpnia 2010

crontab

crontab


Example 9.2. Sample crontab file
#Format
#min hour day mon dow  command

# Download data every night at 7:25 pm
 25  19   *   *   *    $HOME/bin/get.pl

# 8:00 am, on weekdays (Monday through Friday)
 00  08   *   *   1-5  $HOME/bin/dosomething

# Restart the IRC proxy after each reboot
@reboot /usr/bin/dircproxy


crontab - tabela programu cron posiadają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]

Tabele cronu 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. 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]

Przykładowa tabela crontab z systemu GNU/Linux (ze strony podręcznika: man 5 crontab) 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
#
# 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 Kasię od poniedziałku do piątku o godzinie 22:00
0 22 * * 1-5 echo "Kasiu, jest już 22:00. Gdzie są Twoje dzieci?!" | mail -s "Wybiła 22:00" kasia@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"

lub z wykorzystaniem zapisu słownego z wykorzystaniem znaku "@" tzn.:

@reboot echo "System uruchomił się!" -polecenie uruchamiane każdorazowo 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 * * 0"
@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 dwóch zmiennych środowiskowych SHELL i MAILTO. 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.

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:

* Aby uniknąć problemów z uruchomieniem poleceń systemowych, należy w crontabie podawać pełne ścieżki do nich. Tak samo należy postąpić w przypadku skryptów, które są wywoływane przez crontaba - również w nich trzeba umieścić pełne ścieżki do poleceń.

* Dzień wykonania komendy można wyspecyfikować na dwa sposoby: podając dzień miesiąca lub dzień tygodnia. Jeśli oba pola są ustawione, to komenda wykona się zarówno w ustawiony dzień miesiąca, jak i w ustawiony dzień tygodnia!

* Wartości liczbowe możemy zapisywać w różnych formatach:
o 1-3 - czyli wartości 1,2,3
o 0-10/2 - czyli wartość 0,2,4,6,8 i 10 (co druga wartość ze zbioru od 0 do 10)
o 1,2,5 - czyli wartości kolejno 1,2,5
o */2 - co 2 dozwolona wartość (np. w pierwszej kolumnie będzie to 0,2,4,6...56,58)
o 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.

-------------------------------------------------------------------------------------

Automatyzacja zadań - cron, at, anacron

Tym razem jak sam tytuł wskazuje zajmę się problemem automatyzacji zadań o których możemy zaliczyć tworzenie kopi zapasowych, wysyłanie raportów mailem oraz wiele innych zadań, które mają być wykonywane w tle bez naszego udziału.

W artykule zajme się opisem trzech podstawowych programów, które różnia sie sposobem działania oraz sytuacjami w których nalezy je stosować.
Zaczne od programu cron, który jest demonem systemowym, odpowiedzialnym za uruchamianie programów (zadań) cyklicznie lub o określonej porze (działa w systemach przcujących ciągle tj. 24 godziny na dobę). W zależności od dystrybucji start demona "cron" odbywać sie może troche inaczej. W większości dystrybujci cron domyślnie jest uruchomiony, ale w razie watpliwości w Fedorze uruchamiamy go nst.:
[root@localhost ~]# service crond start
Uruchamianie crond: [ OK ]
[root@localhost ~]#

Cron przegląda /var/spool/cron/crontabs w poszukiwaniu plików-tabel (crontab), nazywanych według kont w /etc/passwd (tabele w /var nie powinny być bezpośrednio modyfikowane). Cron szuka również /etc/crontab lub /etc/cron.d/crontab, które jest w innym formacie następnie budzi się co minutę, sprawdzając wszystkie zapisane tabele. Podczas wywoływania komend, wszelkie ich wyjście jest przesyłane pocztą do właściciela tabeli (lub do użytkownika podanego w zmiennej środowiskowej MAILTO w tabeli, jeśli taki istnieje).
Ważna informacja to taka, że crona nie trzeba restartowac po kazdej wprowadzonej zmianie ponieważ cron sprawdzi czasy modyfikacji tabel i przeładuje wszystkie te, które były ostatnio zmienione.
Do instalacji, deinstalacji lub oglądania zawartości tabel używanych przez demon cron słuzy program crontab.
Standartowo z crontab może korzystać root, jeżeli chcemy aby inni uzytkownicy mogli również z niego korzystać to musimy im na to zezwolić. Służą do tego pliki cron.allow i cron.deny w /etc. Najlepiej zrobić nst. wpisy: w /etc/cron.deny wpisać all, zabroni to wszystkim kozystac z crontab'a, a następnie w /etc/cron.allow dopisac uzytkowników, którym pozwolimy na jego używanie
(Nadanie innemu użytkownikowi dostępu do crona nie powoduje, że będzie on mógł uruchamiać zaplanowane zadania jako root.).

Edycja pliku crontab jest nst.:
crontab -e - edycja,
crontab -l - wswietlanie listy,
crontab -r - usówanie.

Wpisy w plikach crontab zbudowane są z 6 pól. Pierwsze 5 pól określa czas wykonania, natomiast 6 pole czynność.
Minuty Godziny Dni Miesiące Dni tygodnia Zadanie
01 * * * * echo "co 1 min.wpis do" >> min.txt
01 12 5 * mon /home/user/skrypt.sh
00 12 * 1-12/2 * /home/user/skrypt.sh
05 12 01 01 * echo "happy new year"
5 0 * * * polecenie (5 po północy dziennie)
15 16 1 * * polecenie (16:15 pierwzego każd.m-ca)
0 4 * * 7 polecenie (4:00 w każdą niedzielę)
30 4 * * 1-5 polecenie (4:30 od pon. do piątku)
Pierwszej pozycji nie musze objasniać, druga - o 12:01 piątego oraz poniedziałek każdego miesiąca zostanie wykonany skrypt. W trzeciej pozycji skrypt będzie wykonywany co drugi miesiąc każdego dnia o godzinie 12:00. W ostatniej pierwszego stycznie o godzinie 12:05 linux złozy nam zyczenia (o ile przekierujemy echo)

Znaczenie pól:
- Minuta (zakres 0-59)
- Godzina (zakres 0-23)
- Dzień (zakres 0-31)
- Miesiąc (zakres 0-12 lub nazwa, pierwsze 3 litery nazwy angielskiej)
- Dzień_Tygodnia (zakres 0-7 lub nazwa (0 i 7 to niedziela), pierwsze 3 litery nazwy angielskiej)
- Polecenie (reszta linii)

Pole może mieć gwiazdkę (*), czyli wykonuj zawsze.
Dozwolone są zakresy liczb, oddzielonych przecinkami lub myślnikiem. Zakres ten jest domknięty. np. 8-11 dla godzin oznacza wywoływanie w godzinach 8, 9, 10, 11. Dozwolone są też listy. Lista jest zbiorem liczb (lub zakresów), oddzielonych przecinkami. np. 1,2,5,9 albo 0-4,8-12 mozna równiez dzielić okresy czasu np. */2 - wykonanie co 2 jednostki czasu

Anacron
Anacron nie jest demonem crona. Zazwyczaj pracuje w połączeniu z cronem. Wykonuje polecenia w odstępach czasu podawanych w dniach oraz nie czyni założeń o ciągłym działaniu systemu. Uruchamia zadania, które nie zostały wywołane podczas wyłączeń systemu. Anacron przeważnie jest uruchamiany przez demona cron raz dziennie.
Do uruchamiania zadań za poprzez anacron'a edytujemy plik /etc/anacrontab, ktory składa sie z czterech nst. pól:
Ilość dni miedzy uruchomieniami Opóźnienie w min. Nazwa zadania Zadanie
1 65 cron.daily /etc/cron.daily
7 70 cron.weekly /etc/cron.weekly
30 75 cron.monthly /etc/cron.monthly
Program Anacron kończy działanie po tym, gdy wszystkie zadania wymienione w pliku anacrontab, zostaną wykonane.
Uruchamiając anacron przy starcie systemu umożliwimy mu wykonanie wszystkich cznnośc, których cron nie zdołał wykonać, może byc przydatny zwłaszcza przy zadaniach typu weekly, monthly.

At
At wykonuje polecenia o zadanym czasie - tylko raz, czyta on ze standardowego wejścia lub podanego pliku polecenia, które mają zostać wykonane w późniejszym czasie przy użyciu /bin/sh.
Tak jak przy innych tego typu programach superużytkownik może zawsze posługiwać się opisywanymi poleceniami. Dla pozostałych użytkowników tworzymy plik /etc/at.allow i /etc/at.deny. Jeżeli istnieje plik /etc/at.allow, to wyłącznie użytkownicy, których nazwy doń wpisano, mają prawo uruchamiania at. Jeśli nie istnieje /etc/at.allow, to sprawdzany jest plik /etc/at.deny, a każdemu użytkownikowi, którego w nim nie wymieniono, zezwala się na używanie at. Jeśli nie istnieje żaden z plików kontrolujących dostęp do polecenia at, to posługiwać się nim może wyłącznie superużytkownik.
Pusty plik /etc/at.deny oznacza, że pozwala się na używanie opisywanych poleceń wszystkim użytkownikom. Jest to konfiguracja domyślna.

Po tej krótkiej teorii mozemyprzejść do podstawowej składni.
Dla przykładu wpisujemy:
[root@localhost ~]# at 15:45
at> echo "wpis do pliku atd.txt" > atd.txt
at> (Wprowadzanie poleceń kończymy wciskając w nowej linii kombinację klawiszy [Ctrl]+[d])
job 5 at 2007-12-11 15:45
Can't open /var/run/atd.pid to signal atd. No atd running?
To oznacza, że nie uruchomiliśmy demona atd:
[root@localhost ~]# service atd start
Uruchamianie atd: [ OK ]
[root@localhost ~]# at 15:45
at> echo "wpis do pliku atd.txt" > atd.txt
at> job 6 at 2007-12-11 15:45
Zobaczmy potwierdzenie wraz z podanym terminem uruchomienia polecenia.
Aby sprawdzic ile zadań czeka w kolejce do późniejszego wkonania wpisujemy polecenia atq:
[root@localhost ~]# atq
5 2007-12-11 15:45 a root
3 2007-12-10 16:34 a root
1 2007-12-10 16:32 a root
6 2007-12-11 15:45 a root
4 2007-12-11 15:45 a rambix
[root@localhost ~]#
Jeśli z jakiegoś powodu zrezygnujemy z wykonywania zleconego polecenia, to możemy je usunąć poleceniem atrm z podanym numerem zadania przeznaczonego do skasowania. Numer ten możemy odczytać w pierwszej kolumnie wyniku polecenia atq.

Czas w at możemy podawac na wieele sposobów, oto przykłady:
at 18:21 - podając godzine wykonania zadania,
at 18:23 04.03.04 - podając godzine i konkretny dzień wykonania zadania,
at 4pm + 3 days - można stosować znak "+" jako informacja, że czas(data) wykonania to suma dwóch czasów(dat). Np. za trzy dni o czwartej,
at 10am Jul 31 04 - daty i czasy mogą być mieszane,
at 1am tomorrow - możemy stosowac "pisane" daty,

1 komentarz: