Czasem potrzeba uruchomić jakieś polecenie, czy jakiś skrypt automatycznie, w określonym momencie (czasie), i tu z pomocą przychodzi nam CRON – rodzaj systemowego harmonogramu zadań w systemie Linux, a tym samym w Raspberry Pi. Nie będę opisywał całej struktury i zasady działania, gdyż w Internecie można znaleźć na ten temat wiele przystępnie napisanych poradników. Ale jednak jakieś podstawy postaram się podać, tak by zostało w pamięci, że takie narzędzie istnieje, i czasem może nam się przydać (np. kopie zapasowe, czy automatyczne aktualizacje systemu).

CRON i CRONTAB

W uproszczeniu CRON to usługa, która korzysta z tabel z zadaniami, tzw. „crontab”:

cron – uniksowy daemon zajmujący się okresowym wywoływaniem innych programów. Posługuje się on tabelami crontab do przechowywania informacji jakie zadanie ma uruchamiać.

Źródło: Wikipedia

Warto zacząć od sprawdzenia, czy w naszym systemie usługa działa. W tym celu korzystamy z polecenia:

/etc/init.d/cron status

raspberry-pi_cron_01

Jak widać – usługa działa:

[ ok] cron is running.

Zadania użytkownika

Jako użytkownik możemy zdefiniować zadania, które system wykona automatycznie „w naszym imieniu” (z uprawnieniami naszego użytkownika) korzystając z polecenia:

crontab -e

raspberry-pi_cron_02

Otworzy nam się „plik tekstowy” w który możemy dodawać kolejne pozycje/polecenia.

Składnia wpisów jest następująca:

[minuty(0-59)] [godzina(0-23)] [dzień_miesiąca(0-31)] [miesiąc(1-12)] [dzień_tygodnia(0-7, 0/7-niedziela)] [polecenie]

* * * * * skrypt/polecenie

* * * * * skrypt/polecenie1; skrypt/polecenie2

Możemy stosować:

  • * – zawsze (każda minuta, każda godzina, każdy dzień, każdy miesiąc, każdy dzień tygodnia)
  • Zakres: x-y – czyli od „x” do „y”, np. „1-5” to każda minuta/godzina/dzień/miesiąc od 1 do 5
  • Przerwa: */x – np. „*/8” to polecenie wykonane co 8 minut/godzin/dni…
  • Kolejne wartości: x,y,z – np. „2,5,8” może oznaczać polecenie wykonane w 2, 5 i 8 minucie/godzinie…
  • Wiele zadań w jednym wpisie: ; rozdzielamy polecenia

Kilka przykładów, by lepiej zrozumieć zasadę budowy:

  • */5 * * * * [Co 5 minut]
  • 0 4 * * * [O 4 rano]
  • 0 5 * * 0 [O 5 rano w niedzielę (0 lub 7)]
  • 15 8,10 1-15 1 * [O 8:15 i 10:15, od 1 do 15 stycznia (1)]

W pewnych przypadkach (np. błędy) system może wysyłać na powiadomienie na e-mail (zależy od konfiguracji systemu). Możemy wyłączyć taką informację dla konkretnego zadania, dodając:

>/dev/null 2>&1

na końcu linii z poleceniem, np.:

5 10 * * * skrypt_lub_polecenie >/dev/null 2>&1

Skrypt lub polecenie wykona się o 10:05 (codziennie), a ew. raport „poleci w kosmos”.

Cron(tab) systemowy

Oprócz naszego, indywidualnego (użytkownika) istnieje też „systemowa” tabela zadań Cron.

sudo nano /etc/crontab

Budowa wpisów jest podobna do tabeli użytkownika, z tym że dodatkowo między „kiedy” a „komenda/polecenie” należy podać użytkownika, w „imieniu którego” wykona się konkretne polecenie:

raspberry-pi_cron_04

Skrypty w katalogach cron.x

Kolejne miejsce związane z tematem to katalogi, w których znajdują się skrypty uruchamiane w określonych okresach.

Są to:

  • /etc/cron.daily – codziennie
  • /etc/cron.hourly – co godzinę
  • /etc/cron.weekly – raz w tygodniu
  • /etc/cron.monthly – raz w miesiącu

raspberry-pi_cron_03

Każdy skrypt, który znajduje się w tych katalogach, zostanie uruchomiony zgodnie z jego nazwą.

@reboot

Wprawdzie jest to element zarządzania, kiedy ma się uruchomić dane polecenie czy skrypt, ale jest na tyle inne od pozostałych, że postanowiłem je wydzielić.

Za pomocą wpisu z @reboot otrzymacie możliwość uruchamiania polecenia/skryptu przy każdym uruchomieniu systemu. Np. by wyświetlić przy każdym uruchomieniu systemu komunikat „System uruchomiony” dodajemy do CRONa taką linijkę:

@reboot echo "System uruchomiony"
@reboot /ścieżka/do/skryptu

@reboot wpisujemy jako określenie, kiedy ma się uruchamiać skrypt, czyli zamiast „* * * * *”.

Można też wykonanie zadania opóźnić, np. o 20 sekund:

@reboot sleep 20 && /ścieżka/do/skryptu

Gdyby takie zadania się nie wykonywały, to warto sprawdzić, czy CRON startuje przy starcie systemu:

sudo systemctl status cron.service

I ew. aktywować:

sudo systemctl enable cron.service

Zarządzanie CRONem

Jeszcze kilka poleceń, które mogą się przydać – restart usługi:

sudo /etc/init.d/cron restart

Ręczny start usługi:

sudo /etc/init.d/cron start

Ręczne zatrzymanie usługi:

sudo /etc/init.d/cron stop

/var/log/cron.log

Warto aktywować logi zadań CRON’a, zwłaszcza gdy macie więcej wpisów i nie macie pewności, że wszystko idzie „zgodnie z planem harmonogramem” ;-)

Zaczynamy od edycji pliku:

sudo nano /etc/rsyslog.conf

I szukamy linijki (~ nr 63):

#cron.* /var/log/cron.log

i zmieniamy na:

cron.* /var/log/cron.log

Teraz tylko restart „logera”:

sudo /etc/init.d/rsyslog restart

Log z zadań CRONa będzie teraz zapisywany do pliku:

/var/log/cron.log

MAILTO

By się ustrzec – zwłaszcza jak mamy więcej, często uruchamianych zadań – niepotrzebnych „śmieci” w logach, np.:

MAIL (mailed 1 byte of output; but got status 0x0044, #012)

warto jeszcze dodać tablicach CRONa:

crontab -e

następujący wpis:

MAILTO=""

I tu z doświadczenia powiem, że czasem może być potrzeba dodania tego wpisu dla wszystkich użytkowników, nawet tych, co nie mają żadnych zadań.

Pewnie nie zaszkodzi dodać wpisu również do CRONa systemowego:

sudo nano /etc/crontab

Pamiętajcie, o restarcie usługi na koniec:

sudo /etc/init.d/cron restart

Zobacz wszystkie artykuły z serii „Raspberry Pi”

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk