Narzędzia użytkownika

Narzędzia witryny


materialy:podstawy-administracji:automatyzacja-zadan

Automatyzacja zadań

Wykonywanie zadań zleconych za pomocą at

Najprostszą metodą zlecenie zadań do wykonania na później jest użycie demona atd i związanych z nim komend at, atq oraz atrm do tworzenia, wyświetlania i usuwania zadań zdefiniowanych na przyszłość.

Z punktu widzenia administratora ważne jest, aby serwis atd działał non-stop - upewnij się, że serwis jest uruchomiony i że będzie uruchomiony po restarcie.

Jeśli używasz Centos 6 lub 7 w wersji serwerowej to możliwe, że musisz doinstalować oprogramowanie at i skonfigurować system, aby serwis atd uruchamiał się przy starcie systemu.

yum install at

chkconfig --add atd # w CentOS 6
service atd start # w CentOS 6

systemctl enable atd.service # w CentOS 7
systemctl start atd.service # w CentOS 7

at, atq, atrm

Podstawową komendą do tworzenia zadań do wykonania ich w przyszłości jest at. Jako argument przyjmuje godzinę lub godzinę i datę. Po naciśnięciu ENTERa komenda wchodzi tryb w którym użytkownik podaje komendy do uruchomienia o zdefiniowanej porze. Można podać wiele komend, każda w innej linii - komendy będą wykonywane jedna po drugiej, tak jak w skrypcie. Gdy edycja wpisu jest zakończona użytkownik musi nacisnąć CTRL+D, aby at przyjął do wiadomości co ma wykonać.

$ at 04:14 2014-05-01
at> /usr/sbin/backup-systemu.sh
CTRL+D

Możliwe są inne formy podania czasu rozpoczęcia wykonywania zadania:

  • at now + 5 minutes - za pięć minut
  • at now + 2 days - za dwa dni
  • at midnight - o północy
  • at noon - 1 hour - o godzinie 11:00 AM
  • at teatime - o 4 PM.

Wyświetlenie zadań, które czekają wkolejce na wykonanie - komenda atq (at queue):

atq
3       2014-05-01 04:14 a root
4       2014-04-28 03:11 a root
2       2014-05-01 09:00 a root
6       2014-04-30 03:09 a root
1       2014-05-01 02:57 a root
5       2014-04-28 11:45 a root

Pierwsza kolumna wyświetlanego listingu to identyfikator zadania do wykonania. Identyfikator jest potrzebny, gdy jest potrzeba usunięcia zadania z kolejki, np. nr 3:

atrm 3

Aby wyświetlić treść zadania już zdefiniowanego wcześniej, które teraz czeka w kolejce, np. nr 5:

at -c 5

at.allow at.deny

Najczęściej każdy nowy użytkownik w systemie może używać komend at, atq, atrm do zarządzania zadaniami wykonywanymi o określonym czasie. Można jednak ograniczać te prawa.

Jeśli istnieje plik /etc/at.allow to z komendy at mogą korzystać tylko użytkownicy, których loginy są jawnie wpisane do tego pliku konfiguracyjnego.

Jeśli plik /etc/at.allow nie istnieje a istnieje /etc/at.deny to loginy użytkowników wpisane w ten drugi plik mają zabroniony dostęp do komendy at (reszta ma dostęp).

W przypadku, gdy w systemie istnieją oba pliki brany jest pod uwagę jedynie /etc/at.allow.

Zadania

  1. Jako administrator dopisz zadanie w at, które dopisze aktualną godzinę do pliku /var/log/data za 15 minut od momentu utworzenia zadania.
  2. Utwórz zadanie w at, które dopisze do pliku /var/log/conf.count liczbę plików o rozszerzeniu .conf z katalogu /etc. Zadanie ma być uruchomione najbliższej północy.
  3. Utwórz zadanie w at, które dopisze do pliku /var/log/root-files.count liczbę plików z całego systemu, których właścicielem jest root. Zadanie ma być wykonane o godzinie 18:00
  4. Sprawdź kolejki zleconych zadań w at.
  5. Wyświetl komendę, jaka zostanie wykonana z ostatnim zdefiniowanym zadaniem.
  6. Usuń z kolejki ostatnio zdefiniowane zadanie i zweryfikuj czy zostało usunięte.

Wykonywanie zadań cyklicznych w cron

Demon cron to linuksowy harmonogram zadań - odpowiedzialny za cykliczne uruchamianie programów lub skryptów.

W Debianie 7 nazwa serwisu to cron, w CentOS 6 crond - sprawdź jak zarządzać serwisami.

Aby działanie demona cron miało swój efekt demon ten musi działać non-stop. Głównym zadaniem demona jest uruchomienie w zdefiniowanych przez użytkownika datach i czasach komendy. Konfiguracja crona opiera się głównie na cykliczności - uruchom co godzinę, codziennie, w każdy piątek, 20-go dnia każdego miesiąca itp. Najczęściej z crona korzystają administratorzy, którzy dla dbałości o system wykonują zadania cykliczne - np. rotacja logów, backup itp. Aby nie wykonywać tych operacji „ręcznie” używany jest cron. Jeśli tylko zadanie nie wymaga interaktywności z użytkownikiem to znakomicie nadaje się do uruchamiania z poziomu crona. Ważne, aby podczas działania program, skrypt czy demon nie wymagał wpisywania tekstu (podejmowania decyzji) ze strony użytkownika czy administratora.

Demon cron działa w kontekście użytkownika root, nie oznacza to jednak, że uruchomione programy czy skrypty będą działały w kontekście administratora.

Pliki konfiguracyjne

Cron korzysta z wielu plików konfiguracyjnych:

/var/spool/cron/

Pliki konfiguracyjne użytkowników (każdy użytkownik może zdefiniować własne zadania cykliczne) zamieszczane są w katalogu /var/spool/cron/. Plików tych nie należy edytować bezpośrednio, używa się programu crontab z opcją -e

crontab -e

Użytkownik praktycznie nie musi wiedzieć, że konfiguracja jego crona znajduje się w tym katalogu. Powinien o tym jednak wiedzieć administrator, aby choćby zapewnić backup tych plików. Zdefiniowane zadania w cron są uruchamiane w kontekście użytkownika, który definiował konfigurację (wpisał crontab -e i dokonał wpisów). Każda linia pliku konfiguracyjna edytowana za pomocą crontab -e ma 6 pól.

/etc/crontab

Plik /etc/crontab - to główny plik konfiguracyjny dla crontab, choć wielu administratorów odradza, aby zamieszczać tam „swoje” wpisy. Zamiast tego polecają używanie crontab -e z opcjonalnym użyciem parametru -u user który wskazuje w kontekście jakiego użytkownika cron jest modyfikowany. Plik /etc/crontab ma 7 pól, o jedno więcej niż ten edytowany za pomocą crontab -e, gdyż /etc/crontab zawiera również nazwę użytkownika w kontekście którego ma być uruchomione zadanie. Ponieważ dostęp do edycji pliku /etc/crontab ma tylko root można zamieścić tam zadania uruchamiane w kontekście użytkowników, którzy nie mogliby tych zadań zmodyfikować (uruchomienie crontab -e -u user powoduje edycję pliku osobistego użytkownika z katalogu /var/spool/cron/ i użytkownik może później dokonywać jego modyfikacji uruchamiając komendę crontab -e)

/etc/cron.d/

W katalogu /etc/cron.d/ paczki instalacyjne różnego oprogramowania mogą wgrywać swoje pliki konfiguracyjne do crona, Pliki te traktowane są podobnie jak /etc/crontab (mają 7 pól z nazwą użytkownika). Na przykład dystrybucja CentOS 6 po zainstalowaniu narzędzi RAID zamieszcza plik /etc/cron.d/raid-check w której jest definicja uruchamiania aplikacji raid-check w każdą niedzielę o godzinie 1:00 AM.. W dystrybucji Debian 7 po zainstalowaniu oprogramowania John The Ripper tworzony jest plik /etc/cron.d/john w którym zdefiniowane są zadania do cyklicznego łamania haseł. Domyślnie są zakomentowane, ale pozwalają administratorowi szybciej włączyć ten „feature” w systemie.

/etc/cron.hourly/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.monthly/

Te katalogi mogą być używane w zależności od dystrybucji i ich konfiguracji albo przez crona (Debian 7), albo przez inny demon do harmonogramowania zadań - anacron (CentOS 6). Niezależnie od różnic w użytym oprogramowaniu idea katalogów jest taka sama. W katalogach tych administrator lub paczki instalowane przez niego zamieszczają skrypty (lub linki do nich), które mają być uruchamiane co godzinę, co dzień, tydzień lub miesiąc. Nie ma przy tym potrzeby edytowania dodatkowo crontaba.

Ten sam efekt (np. uruchamianie skryptu co miesiąc) można uzyskać przez przygotowanie skryptu w dowolnej lokalizacji i edycję /etc/crontab lub użycie crontab -e. Niemniej jednak, aby administrator a przede wszystkim autorzy paczek instalacyjnych mieli ułatwione zadanie utworzone te właśnie katalogi. Jeśli administrator chce uruchamiać codziennie jakiś skrypt - wystarczy, że go utworzy w odpowiednim katalogu, nie musi wpisywać dodatkowej reguły do crontaba.

Uwaga: anacron jest narzędziem wygodniejszym w przypadku, gdy system nie działa w trybie 24/7. Jeśli system będzie wyłączony w piątek w nocy a w cronie są definicje wykonania backupu o godzinie pierwszej w nocy to nie wykonają się one. Anacron poradzi sobie z taką sytuacją - sprawdzi czy zadanie było wykonywane (rejestruje wszystkie wywołania) i jeśli nie było, może je wykonać po uruchomieniu systemu. Z tego względu anacron można częściej spotkać w tzw. dystrybucjach desktopowych.

/etc/cron.allow /etc/cron.deny

Pliki te służą określaniu, którzy użytkownicy systemu mogą korzystać z demona cron i definiować swoje zadania cykliczne.

  • Jeśli /etc/cron.allow istnieje to użytkownik musi być w nim wpisany (jeden użytkownik per linia) aby mieć możliwość skorzystania z crona. Pusty plik oznacza, że nikt oprócz roota nie może skorzystać z cron.
  • Jeśli /etc/cron.deny istnieje to administrator zamieszcza tam listę użytkowników (jeden per linia), którzy nie mogą z cron korzystać (domyślnie wszyscy mogą).
  • Jeśli oba powyższe pliki są utworzone w systemie to /etc/cron.allow ma wyższy priorytet (/etc/cron.deny jest traktowany tak, jakby go nie było).
  • Jeśli nie ma żadnego z plików to system może zachowywać różnie w zależności od dystrybucji i implementacji (Debian domyślnie pozwala wszystkim użytkownikom używać crontab, CentOS tylko rootowi).

Konfiguracja crontab

Bazując na plikach konfiguracyjnych cron dla dowolnego użytkownika, aby rozpocząć konfigurację cron wpisz:

crontab -e

Po wywołaniu tej komendy będzie uruchomiony domyślny edytor, który w systemie zdefiniowany jest zmienną środowiskową VISUAL. Jeśli nie odpowiada Ci domyślny edytor możesz zmienić w systemie lub dla twojego konta inną wartość domyślną lub tymczasowo, przy uruchomieniu crontaba podawać nową wartość przy uruchamianiu. Poniżej zmiana edytora na nano.

VISUAL=/usr/bin/nano crontab -e

Po dokonaniu zmian w pliku należy zapisać edytowany plik i wyjść z edytora - ten ostatni krok jest o tyle ważny, że zam zapis nie spowoduje, że demon cron przyjmie ostatnio wprowadzonych zmian i ich nie będzie realizował.

Zmiana konfiguracji nie pociąga ze sobą konieczności restartowania lub przeładowywania (reload) serwisu cron, jak to jest w przypadku innych serwisów, wystarczy opuścić edytor wywołany komendą crontab -e.

Składnia pliku konfiguracyjnego

W jednej linii pliku konfiguracyjnego znajduje się zapis jednego zadania do wykonania cyklicznie. Każda linia zawiera 6 lub 7 pól (w zależności od pliku konfiguracyjnego opisywanego wyżej) oddzielonych białymi znakami. Poniżej zmodyfikowany lekko plik crontab pobrany z dystrybucji CentOS, który bardzo dobrze opisuje znacznie każdego pola.

# 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,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * command to be executed
Przykład 1
12 5 * * * /usr/bin/uptime >> /var/log/uptime.log

Wyjaśnienie: każdego dnia, o godzinie 5:12 wynik komendy uptime dopisz do pliku /var/log/uptime.log. Gwiazdki oznaczaja dowolny dzien tygodnia, dowolny miesiąc i dowolny dzień miesiąca.

Przykład 2
*/5 * * * *	/usr/local/bin/sprawdz-lacznosc-z-serwerem-C

Wyjaśnienie: co 5 minut wywołaj komendę /usr/local/bin/sprawdz-lacznosc-z-serwerem-C.

Przykład 3
34 2 1 * *	 /usr/local/bin/pelny-backup-systemu
17 0 2-31 * *	 /usr/local/bin/inkremencyjny-backup-systemu

Wyjaśnienie: pierwszego dnia każdego miesiąca, o godzinie 2:34 wywołaj skrypt /usr/local/bin/pelny-backup-systemu. Drugiego, trzeciego, czwartego, … i 31 dnia każdego miesiąca o godzinie 00:17 wywołaj skrypt: /usr/local/bin/inkremencyjny-backup-systemu.

Przykład 4
45 15 * * fri	/usr/bin/echo "Milego weekendu" | /bin/mail -s "Cotygodniowe zyczenia :)" someone@serwer.pocztowy.pl

Wyjaśnienie: w każdy piątek, o godzinie 15:45 wyślij maila na adres someone@serwer.pocztowy.pl o tresci „Milego weekendu” z tytułem „Cotygodniowe zyczenia :)”

Przykład 5
12 10,15 * 1-3,11-12 * /usr/local/bin/skrypt

Wyjaśnienie: Wykonaj skrypt każdego dnia, w miesiącach od stycznia do marca i od listopada do grudnia w godzinach 10:12 i 15:12.

Inne przykłady dostępne są w dokumentacji.

man crontab

Porady

  1. Na końcu pliku konfiguracyjnego powinna znaleźć się przynajmniej jedna pusta linia. Niektóre implementacje (bądź konfiguracje) programu mcedit automatycznie kasują puste linie znajdujące się na końcu pliku, co jest powodem problemów z konfiguracja crona (ostatniej linii konfiguracyjnej). Użyj w takim przypadku innego edytora lub na końcu pliku dopisz pustą linię komentarza (znak # na początku linii).
  2. W pliku konfiguracyjnym crona należy podawać scieżki bezwzględne (pełne, absolutne) do wywoływanych programów i plików. Zamiast wpisu
    * * * * * date

    należy wpisywać

    * * * * * /usr/bin/date

    Informacje o tym, gdzie znajduje się program binarny uzyskamy przy pomocy komendy which

    which date

Zadania

  1. Skonfiguruj cron, aby system dopisywał co minutę do pliku /var/log/daty.txt aktualną datę.
  2. Skonfiguruj cron, aby system każdej niedzieli, co dwie minuty dopisywał do pliku /var/log/daty2.txt aktualną datę. Zmień datę w systemie, aby zweryfikować zadanie.
  3. Skonfiguruj cron, aby system dopisywał co 10 minut do pliku /var/log/zalogowani.txt liczbę aktualnie zalogowanych użytkowników. Zweryfikuj.
  4. Skonfiguruj system tak, aby tylko użytkownicy o loginach wojtek i root mogli korzystać z crona. Zweryfikuj.
materialy/podstawy-administracji/automatyzacja-zadan.txt · ostatnio zmienione: 2015/02/02 17:48 przez mzalewski

(C) 2017 ITMZ Mariusz Zalewski