Czasem potrzeba uruchomić jakieś polecenie, czy jakiś skrypt automatycznie, w z góry 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 istniej, 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]
  • * 4 * * * [O 4 rano]
  • * 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 „* * * * *”

Zarządzanie CRONem

Jeszcze kilak 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ń CRON’a 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 CRON’a:

crontab -e

następujący wpis:

MAILTO=""

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

Pewnie nie zaszkodzi dodać wpisu również do CRON’a 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

WebInsider poleca księgowość wFirma
WebInsider korzysta z VPSa w HitMe.pl
WebInsider poleca VPSy DigitalOcean
WebInsider poleca serwis Vindicat
Napisz komentarz
wipl_napisz-komentarz_01Jeśli informacje zawarte na tej stronie okazały się pomocne, możesz nam podziękować zostawiając poniżej swój komentarz.

W tej formie możesz również zadać dodatkowe pytania dotyczące wpisu, na które - w miarę możliwości - spróbujemy Ci odpowiedzieć.
Linki partnerskie
Niektóre z linków na tej stronie to tzw. "linki partnerskie", co oznacza, że jeśli klikniesz na link i dokonasz wymaganej akcji (np. zakup/rejestracja) możemy otrzymać za to prowizję. Pamiętaj, że polecamy tylko te produkty i usługi, z których sami korzystamy, i uważamy, że są tego na prawdę warte... :-)
Znaki towarowe i nazwy marek
W niektórych wpisach (oraz innych miejscach na stronie) mogą być przedstawione/użyte znaki towarowe i/lub nazwy marek, które stanowią własność intelektualną tych podmiotów, a zostały użyte wyłącznie w celach informacyjnych.