Zadania Cron – podstawy automatyzacji
Cron Jobs (z ang. zadania cron) brzmi jak dość tajemnicze określenie, a w praktyce jest to niesamowicie przydatne narzędzie, które dzielnie służy każdemu adminowi. Jest to podstawa automatyzacji zaimplementowana w każdym systemie UNIXowym, można to nazwać harmonogramem zadań. Przy pomocy zadań Cron uruchamia się programy, komendy czy skrypty o określonym czasie lub w ustalonych interwałach czasowych.
Zarządzanie zadaniami Cron
Pierwszym krokiem jest utworzenie tablicy „crontab” lub jeżeli taka istnieje to jej edycja (realizuje się to przez to samo polecenie):sudo crontab -e
Poprzez dodanie „sudo” na początku odnosimy się do tablicy zadań administratora systemu root, a więc wszystkie zawarte w nim zadania będą wykonywane właśnie przez tego użytkownika z najwyższymi uprawnieniami. Jest to o tyle istotne, że w większości przypadków zapobiega to konieczności ingerencji użytkownika (np. podania hasła). Jeżeli nie dodamy „sudo” na początku to odnosimy się do tablicy zadań użytkownika, na którym aktualnie jesteśmy zalogowani. Wszystkie zadania zawarte w takiej tablicy będą wykonywane w imieniu tego konkretnego użytkownika i z jego uprawnieniami, więc jeżeli będą one niewystarczające do wykonania czynności zawartych w skrypcie, który ma zostać wykonany, to dane zadanie zakończy się niepowodzeniem.
Tablica crontab działa tak, że jedno zadanie to jedna linijka, która składa się z formuły definiującej interwał (częstotliwość) uruchamiania oraz polecenia, programu lub ścieżki do skryptu, które mają zostać wykonane. Notacja formuły interwału składa się z pięciu części, kolejno – minuta, godzina, dzień miesiąca, miesiąc, dzień tygodnia. Bardzo pomocna tutaj jest strona Crontab Guru. Dla przykładu, zapis:1 2 3 4 * /home/skrypty/jakis-skrypt.sh
Oznacza, że skrypt będzie wykonywany o godzinie 2:01 każdego trzeciego dnia kwietnia bez względu na to jaki to dzień (poniedziałek-niedziela).
Natomiast zapis:0-59/10 7-15 * 2-5 1-5 /home/skrypty/jakis-skrypt.sh
Oznacza, że skrypt będzie wykonywany co 10 minut w godzinach od 7 do 15 każdego dnia od lutego do maja, ale pod warunkiem, że jest to dzień roboczy (poniedziałek-piątek). Myślę, że te dwa przykłady wystarczą do zrozumienia zasady działania.
Automatyzacja aktualizacji systemu
W jednym z poprzednich wpisów stworzyliśmy skrypt do aktualizowania systemu i jego pakietów. Było to można powiedzieć półautomatyczne rozwiązanie, bo o ile wystarczyło wywołać jednym poleceniem skrypt, który miał w sobie wiele poleceń, tak dalej trzeba było to robić ręcznie. Natomiast w niniejszym wpisie rozszerzymy sobie to o obsługę zadaniami Cron, czego efektem będzie całkowicie automatyczna aktualizacja systemu. To znaczy, że ustawimy wszystko tak, aby codziennie w godzinach nocnych (ustalmy, że będzie to 3:00) wykonywał się skrypt „/home/skrypty/aktualizacja.sh”.
Na początek przypomnijmy sobie jak wygląda wcześniej utworzony skrypt:odroid@odroid:~$ cat /home/skrypty/aktualizacja.sh
#!/bin/bash
# Skrypt do aktualizacji systemu i pakietow - odroid.pl
echo 'Krok 1 - update'
sudo apt update echo
'Krok 2 - full-upgrade'
sudo apt full-upgrade -y
echo 'Krok 3 - autoremove'
sudo apt autoremove -y
echo 'Krok 4 - clean'
sudo apt clean
Jak widać we wszystkich istotnych poleceniach używaliśmy na początku „sudo”, a więc muszą one zostać wykonane z uprawnieniami root’a. Dlatego skrypt aktualizujący musi zostać wykonany z tablicy zadań Cron administratora. W celu edycji tej tablicy używamy wcześniej wspomnianego polecenia:sudo crontab -e
Otworzy nam się edytor tekstowy, przechodzimy do ostatniej linijki otwartego pliku i wpisujemy:0 3 * * * /home/skrypty/aktualizacja.sh
Taka notacja oznacza, że tak jak wcześniej ustaliliśmy skrypt „/home/skrypty/aktualizacja.sh” będzie uruchamiany dokładnie w zerowej minucie, trzeciej godziny, każdego dnia miesiąca, każdego miesiąca, bez względu na to jaki to dzień tygodnia. Plik zapisujemy i wychodzimy z edytora.
Logi z działania zadania
W zasadzie moglibyśmy to zostawić tak jak jest, ale jaką mamy pewność, że zadanie zostało poprawnie wykonane? Przecież skrypt będzie wykonywany w tle, bez wyświetlania nam rezultatu i to w dodatku w nocy kiedy śpimy. Nie jest to dobra praktyka, dlatego za chwilę pokażę jak zapisywać wynik działania zadania do pliku, który będziemy mogli sobie podejrzeć w dowolnej chwili po wykonaniu zadania. Stworzymy sobie dość prosty dziennik zdarzeń.
Najpierw utwórzmy folder, w którym będziemy przechowywać rzeczone logi, najlepszym miejscem do tego będzie podfolder w miejscu, gdzie przechowujemy nasze skrypty bash:sudo mkdir /home/skrypty/logi
Teraz otwórzmy tablicę zadań Cron:sudo crontab -e
I zmodyfikujmy wcześniej wpisany wiersz:0 3 * * * /home/skrypty/aktualizacja.sh > /home/skrypty/logi/aktualizacja_sh.log 2>&1
W ten sposób przekierowaliśmy komunikaty wyświetlane podczas pracy skryptu „aktualizacja.sh” do pliku „aktualizacja_sh.log”. W ten sposób będziemy mieli log z każdego ostatniego uruchomienia skryptu, co daje nam możliwość podejrzenia co dokładnie się stało (czy został wykonany poprawnie czy też nie). Dodatkowo dobrze jest po każdej zmianie przeładować tablicę zadań Cron:sudo service cron reload
Jeżeli materiał zawarty w tym wpisie jest dla Ciebie wartościowy i masz ochotę wesprzeć moją pracę to zapraszam na mój profil na >Patronite<. Zachęcam także do odwiedzenia mojej strony >tomaszdunia.pl<. Możesz także zagadać do mnie na Twitterze >@theto3k<.
Poprzedni wpis:
speedtest-cli – sprawdzenie prędkości internetu
Następny wpis:
Automatyczna kopia zapasowa – skrypt + cron
Kategorie: Dla początkujących,Poradniki,Skrypty - @ 2022-10-07 18:00
Tagi: aktualizacja, automatyzacja, Cron, cron jobs, Crontab, harmonogram zadań, Linux, logi, ODROID, RaspberryPi, Unix, update, upgrade, zadania cron
Idealnie, bo właśnie się zastanawiałem co to za serwis „cron” uruchamia mi się na starcie DietPi. 🙂
To super, że się przydało! Za tydzień kontynuujemy temat cron, ale tym razem zamiast skryptu do automatycznej aktualizacji zrobimy taki do robienia automatycznego backupu! 🙂
Dzięki kolejnemu wpisowi zrobiłem sobie automat do odpalania komend Rclone. Dzięki
No i super !!!