Przejdź do głównej zawartości

Linux RHCSA cz.37 - Automatyzacja działań - CRON

W każdym systemie operacyjnym istnieją takie prace, jakie wykonuje się cyklicznie i są powtarzalne. Proces ten nosi nazwę - planowanych działań (job scheduling) i zazwyczaj bazuje na czynnościach zdefiniowanych przez użytkownika. W RedHat narzędziem do automatyzacji i wykonywania powtarzających się czynności jest "cron". Domyślnie RedHat posiada kilka zdefiniowanych prac systemowych jakie można konfigurować czasowo (godzinowo, codziennie, co tydzień, miesięcznie itd).

Krok 1 - Chociaż pakiet "cron" powinien być zainstalowany domyślnie warto jednak sprawdzić czy faktycznie tak jest

# rpm -qa | grep cron
cronie-1.4.4-2.el6.x86_64
cronie-anacron-1.4.4-2.el6.x86_64
crontabs-1.10-32.1.el6.noarch

Krok 2 - Jeżeli pakiety nie są zainstalowane zróbmy to teraz

# yum install -y cronie cronie-anacron crontabs

Krok 3 - Sprawdzenie czy usługa "cron" jest uruchomiona

# service crond status
crond (pid 2239) is running...

Krok 4 - Sprawdzamy również czy "cron" uruchamia się wraz z systemem

# chkconfig --list crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Zaczynając pracę z usługą "cron" należy zapoznać się z dwoma plikami konfiguracyjnymi :
  • /etc/cron.allow
  • /etc/cron.deny
Plik /etc/cron.allow
  • Jeżeli istnieje, tylko ci użytkownicy mają zezwolenie (cron.deny jest ignorowany) 
  • Jeżeli nie istnieje, wszyscy użytkownicy mają uprawnienia zgodnie z cron.deny
Plik /etc/cron.deny :
  • Jeżeli istnieje i jest pusty, wszyscy użytkownicy mają zezwolenie 
  • Jeżeli nie istnieje tylko root może używać cron

TWORZENIE ZADAŃ W CRON

Domyślnie w RedHat wszyscy użytkownicy są uprawnieni do korzystania z narzędzia "cron". W celu otworzenia nowego zadania posługujemy się poleceniem "crontab".

Składnia polecenia crontab : # crontab [-u user] [opcje]

Opcje polecenia crontab:
  • -e  - Edycja użytkownika crontab
  • -l   - Lista użytkowników crontab
  • -r  - Usunięcie użytkownika z crontab
  • -i   - Komunikat przed usunięciem użytkownika z crontab
Zanim zaczniesz używać polecenia crontab zapoznaj się z stosowanym formatem zapisu zadań. Każdy z użytkowników posiada swój plik crontab w /var/spool/cron (plik ten tworzony jest w momencie pierwszego użycia polecenia crontab). Wszystkie akcje posiadają własne logi zapisywane w /var/log/cron.

By zrozumieć składnie crontab zobaczmy plik /etc/crontab:

# grep ^# /etc/crontab
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,etc.
# | | | | |
# * * * * * command to be executed

By dokładniej pokazać o co w tym chodzi stworzymy proste zadanie w katalogu /tmp 
Przykładowy skrypt do wykonywania w cron :

# vi /tmp/sample_script
#!/bin/bash
#
# Send a msg to all users on the console
#
wall “Hello World”

Zapisujemy plik i nadajemy uprawnienia do wykonywania go :

# chmod 775 /tmp/sample_script

Teraz zajmiemy się dodaniem nowego zadana do usługi cron. Ponieważ działamy jako użytkownik root nadamy prace crontab dla zwykłego użytkownika User01. 

Krok 1 - Ustawienie crontab dla User01

# crontab -u user01 -e

Krok 2 - Dodanie linii

* * * * * /tmp/sample_script

Krok 3 - Zapis pliku i wyjście z edytora

Ponieważ testowo wszędzie użyliśmy symbolu "*" skrypt będzie wykonywał się co 60 sekund wyświetlając napis na ekranie "Hello World".

Krok 4 - Sprawdzenie jakie zadania cron wykonuje User01

# crontab -u user01 -l
* * * * * /tmp/sample_script

Krok 5 - Usunięcie zadań crontab dla User01

# crontab -u user01 -r

Krok 6 - Można sprawdzić aktywność crontab podglądając zawartość pliku logu.

# tail /var/log/cron
Sep 10 09:08:01 new-host crond[4213]: (user01) CMD
(/tmp/sample_script)
Sep 10 09:08:38 new-host crontab[4220]: (root) LIST (user01)
Sep 10 09:09:01 new-host crond[4224]: (user01) CMD
(/tmp/sample_script)
Sep 10 09:10:01 new-host crond[4230]: (user01) CMD
(/tmp/sample_script)
Sep 10 09:11:01 new-host crond[4236]: (user01) CMD
(/tmp/sample_script)
Sep 10 09:12:01 new-host crond[4242]: (user01) CMD
(/tmp/sample_script)
Sep 10 09:13:01 new-host crond[4248]: (user01) CMD
(/tmp/sample_script)
Sep 10 09:13:06 new-host crontab[4251]: (root) LIST (user01)
Sep 10 09:14:01 new-host crond[4253]: (user01) CMD
(/tmp/sample_script)
Sep 10 09:14:15 new-host crontab[4258]: (root) DELETE (user01)

Widać, że wykonywany był skrypt /tmp/sample_script oraz że użytkownik root wyłączył jego wykonywanie. 
W wydaniu RHEL5 plik /etc/crontab, który używany jest z użytkownika root różni się nieco od formatu jaki posiadają zwyczajni użytkownicy systemu. Plik /etc/crontab posiada dodatkowe miejsce pomiędzy ustawieniami czasu, a właściwym poleceniem do wykonania i w miejscu tym musimy zdefiniować, z jakiego użytkownika to konkretne polecenie będzie wykonywane. 

# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Tutaj użytkownik root zdefiniowany został dla potrzeb specyficznych poleceń. Miejsce na wpisywanie użytkownika w crontab jest opcją w RHEL6.
Jak myślisz czy stanie się coś jeżeli cron ustawiono tak by pracował całą noc nad przygotowaniem jakiegoś raportu, a ty wyłaczysz komputer po powrocie do domu? Okazuje się, iż własnie przedstawię kolejną ważną cechę cron. W pliku /etc/anacrontab definiowane są zadania jakie mają zostać wykonane za każdym razem gdy system zostanie uruchomiony. Jeżeli system zostanie wyłaczony w momencie pracy cona po uruchomieniu zostaną ponowanie wywołane usługi /etc/anacrontab by mieć pewność że wszystkie niedokończone zadania zostały zrealizowane.

Zobaczmy plik /etc/anacrontab :

# cat anacrontab

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly

Komentarze zawarte w pliku pozwalają łatwo zrozumieć jego zadanie.

Komentarze

Prześlij komentarz

Najczęściej czytane w tym miesiącu

50 popularnych pytań dotyczących systemu Linux zadawanych na rozmowach kwalifikacyjnych. (Pytania & Odpowiedzi)

Jak dodać użytkownika w systemie Windows z poziomu konsoli CMD? (net user, net localgroup)

Generowanie testowych plików o określonej wielkości