Cron

Zadania cron są używane do planowania różnych działań na serwerze. Zwykle używane są do cyklicznego uruchamiania skryptów np. codziennie o określonej godzinie. Cron jest unixowym demonem (działa na systemach Linux, FreeBSD, MacOs), służącym do okresowego uruchamiania innych programów. Demon – w wielozadaniowych (najczęściej uniksopodobnych) systemach operacyjnych proces, który pracuje w tle bez konieczności interakcji z użytkownikiem. Większość demonów to programy usługowe, które komunikują się za pomocą połączeń sieciowych (co jest zazwyczaj jedyną formą kontroli). Typowy demon po uruchomieniu przekierowuje standardowe strumienie, co czyni go niezależnym od terminala kontrolującego (controlling terminal). Wówczas wszelkie komunikaty informacyjne mogą być zapisywane w osobnych plikach (logach).
źródło Wikipedia
Użytkownicy Windowsa zamiast crona mogą używać Task Schedulera (omówię go na końcu artykułu), który niestety nie ma wszystkich funkcjonalności crona, ale do podstawowych zastosowań w zupełności wystarczy.
Cron szuka tabel crontab, które znajdują się domyślnie w /var/spool/cron/crontabs. Ich nazwy są zgodne z istniejącymi kontami użytkowników. Ładuje również plik konfiguracyjny /etc/crontab, gdzie wpisane są dodatkowe reguły, które uruchamiają zadania cogodzinowe, codzienne, cotygodniowe i comiesięczne. Zadania te wpisywane są w postaci skryptów do katalogów: /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly.

Przykład zadania cron

Najprostszy wpis w pliku crontab składa się z określenia czasu wykonywania oraz ścieżki do pliku, który ma być uruchomiony.
* * * * * /home/gosia/sites/plik
Zapis w tablicy crontab może również wyglądać np. tak jak poniższy.
0 0 * * * /usr/bin/php /home/gosia/sites/cron.php > /dev/null 2>&1
Zapis ten oznacza, że skrypt cron.php będzie uruchamiany przy użyciu parsera PHP, codziennie o północy. Wyjście skryptu będzie ignorowane, natomiast ewentualne błędy będą wyświetlane na ekranie. Skrypty PHP muszą być uruchamiane za pomocą parsera PHP, zatem przed ścieżką do pliku podajemy również ścieżkę do parsera. Najczęściej ścieżka ma postać /usr/bin/php lub /usr/bin/php-fcgi. W celu znalezienia naszej lokalizacji możemy użyć polecenia: which php.

Określenie czasu

To kiedy skrypt będzie wykonywany określa pięć elementów. Oznaczają one kolejno minuta (0-59), godzina (0-23), dzień miesiąca (1-31), miesiąc (1-12) i dzień tygodnia (0-6, 0 oznacza niedzielę). Zamiast liczby można wpisać też gwiazdkę (*), która reprezentuje wszystkie możliwe liczby na danej pozycji. Poniższy zapis oznacza, że polecenie będzie wykonywane co minutę.
* * * * * polecenie
Poniżej podaję jeszcze kilka przykładów. Zadanie wykonywane codziennie o północy.
0 0 * * * polecenie
Zadanie będzie wykonywane co godzinę (zawsze 10 minut po pełnej godzinie, tzn. 00:15, 1:15, 2:15 itd.).
10 * * * * polecenie
Zadanie będzie wykonywane raz w miesiącu (zawsze pierwszego dnia miesiąca o północy).
0 0 1 * * polecenie
Możemy zamiast pojedynczej liczby podać zakres np. 1-10. Poniższy zapis oznacza polecenie wykonywane o godzinie 16:10 od poniedziałku do piątku.
10 16 * * 1-5 polecenie
Do określenia czasu na danej pozycji dozwolone jest też podanie kilku liczb lub zakresów oddzielonych przecinkami. Poniższy zapis oznacza, że zadanie będzie wykonywane o północy 1, 5 i 21 dnia każdego miesiąca.
0 0 1,5,21 * * polecenie
Możemy też podać okresy czasu. Zapis oznacza */2 - wykonanie co 2 jednostki czasu. Na przykład polecenie poniżej będzie wykonywane co 2 godziny.
0 */2 * * * polecenie
Jeśli chcemy wykonać jakieś zadanie każdorazowo po uruchomieniu systemu możemy to zrobić za pomocą słowa kluczowego @reboot.
@reboot polecenie

Crontab – zaczynamy

Wszelkie zmiany dotyczące tablic crontabowych wykonujemy poleceniem crontab. W celu wyświetlenia zawartości tablicy dla bieżącego użytkownika wykonujemy polecenie crontab –l. Polecenie crontab –e umożliwia edycję tablicy. Otwiera ją w edytorze tekstowym vi (jest on dość nieporęczny dla osób, które nie miały z nim kontaktu). Aby zacząć pisać w vi wciskamy klawisz i, a następnie wprowadzamy tekst. Na koniec wciskamy Esc, wpisujemy z klawiatury komendę :wq (oznacza zapisz i wyjdź) i wciskamy enter. Zastąpienie crontab zadaniami z pliku odbywa się za pomocą polecenia:
crontab zad.txt
Polecenie crontab –r usuwa zawartość tabeli crontab. Przeanalizujmy jeszcze poniższy zapis.
10 * * * * /usr/bin/php /home/gosia/sites/cron.php > /dev/null 2>&1
Ostatni ciąg po znaku większości oznacza, że przekierowujemy wyjście do /dev/null. W praktyce oznacza to zignorowanie przez system. Ostatnie znaki oznaczają, że wyjście błędów będzie przekierowane do standardowego wyjścia tzn. wyświetlone na ekranie. Można też skierować wyjście do pliku.
10 * * * * /usr/bin/php /home/gosia/sites/cron.php > /log/cron.log

Cykliczne zadania w Windows

Do odpalania cyklicznych zadań w Windows wykorzystamy Task Schedulera. Uruchamiamy go (Start –> Wszystkie Programy –> Akcesoria –> Narzędzia systemowe –> Harmonogram Zadań) i tworzymy nowe zadanie (Plik –> Nowy –> zaplanowane zadanie). Dla danego zadania należy określić kiedy ma się uruchamiać i podać ścieżkę do pliku. W przypadku skryptów php należy podać np. C:\xampp\php\php.exe C:\xampp\htdocs\cron.php (oczywiście ścieżki należy zmienić odpowiednio do własnej lokalizacji).