Co to jest cron?

Autor: Opublikowano

W skrócie: Cron to mechanizm systemów Unix i Linux, który automatycznie uruchamia polecenia lub skrypty według ustalonego harmonogramu. Można nim wykonywać kopie zapasowe, generować raporty czy usuwać stare pliki, na przykład codziennie o 2:30. Aby zadanie działało poprawnie, trzeba określić nie tylko termin, lecz także polecenie, uprawnienia i sposób sprawdzania błędów.

Jak działa cron i do czego służy?

Cron działa w tle jako usługa systemowa: sprawdza harmonogram i uruchamia przypisane do niego polecenia. Pojedyncze takie polecenie z terminem wykonania nazywa się zadaniem cron, a crontab to tabela przechowująca harmonogramy zadań.

Typowe zastosowania to nocny eksport bazy danych, pobieranie danych z zewnętrznego systemu, przeliczanie zestawień oraz porządkowanie plików tymczasowych. Cron odpowiada za uruchomienie operacji, ale nie za jej logikę. Jeśli skrypt kopii zapasowej zawiera błąd, harmonogram sam go nie naprawi ani nie potwierdzi, że kopię da się odtworzyć.

Zadanie wykonuje się z uprawnieniami użytkownika, do którego należy wpis. Zwykle nie trzeba uruchamiać go jako administrator systemu. Konto powinno mieć dostęp tylko do plików i zasobów potrzebnych do danej operacji.

Jak czytać zapis harmonogramu?

W typowym crontabie użytkownika wpis składa się z pięciu pól czasu oraz polecenia. Pola od lewej oznaczają: minutę, godzinę, dzień miesiąca, miesiąc i dzień tygodnia.

30 2 * * * /usr/bin/python3 /home/anna/scripts/raport.py

Ten wpis uruchamia skrypt codziennie o 2:30. Gwiazdka oznacza każdą dopuszczalną wartość pola, więc trzy gwiazdki odpowiadają dowolnemu dniowi miesiąca, miesiącowi i dniowi tygodnia.

HarmonogramZnaczenie
*/15 * * * *Co kwadrans: o minutach 0, 15, 30 i 45
0 8 * * 1-5Od poniedziałku do piątku o 8:00
0 3 1 * *Pierwszego dnia każdego miesiąca o 3:00

Ukośnik określa krok w danym polu, myślnik zakres, a przecinek rozdziela wartości, np. 0,30 w polu minut. Zapis */15 nie oznacza „15 minut po zakończeniu poprzedniego zadania” — harmonogram jest związany z zegarem.

Trzeba uważać na jednoczesne ograniczenie dnia miesiąca i dnia tygodnia. W popularnych implementacjach crona wystarczy wtedy spełnienie jednego z tych dwóch warunków, a nie obu. Przed użyciem takiego zapisu sprawdź dokumentację wersji dostępnej na serwerze.

Pliki systemowe, takie jak /etc/crontab, mają dodatkowo pole użytkownika przed poleceniem. Nie kopiuj ich wpisów bez zmian do osobistego crontaba.

Jak ustawić pierwsze zadanie cron?

Na serwerze z zainstalowanym cronem i dostępem do terminala możesz zastosować poniższą procedurę. Ścieżki w przykładach są przykładowe — zastąp je rzeczywistymi lokalizacjami na swoim koncie.

  1. Sprawdź polecenie ręcznie. Uruchom /usr/bin/python3 /home/anna/scripts/raport.py jako ten sam użytkownik, który będzie wykonywał zadanie.

  2. Otwórz harmonogram poleceniem crontab -e.

  3. Dodaj wpis z zapisem wyniku do pliku:

    30 2 * * * /usr/bin/python3 /home/anna/scripts/raport.py >> /home/anna/logs/raport.log 2>&1
    
  4. Zapisz zmiany i sprawdź wpisy poleceniem crontab -l.

  5. Po planowanej godzinie sprawdź rezultat, np. utworzony raport, oraz zawartość pliku dziennika.

Operator >> dopisuje komunikaty do pliku, a 2>&1 kieruje do niego również komunikaty błędów. Katalog logs musi wcześniej istnieć i być zapisywalny przez użytkownika zadania. Dziennik może rosnąć bez końca, dlatego przy stałym użyciu potrzebuje ograniczenia rozmiaru lub rotacji, czyli okresowego archiwizowania i usuwania starych zapisów.

Na hostingu współdzielonym harmonogram często ustawia się w panelu zamiast w terminalu. W dokumentacji dostawcy potwierdź minimalny odstęp między uruchomieniami, dostępne interpretery oraz limity czasu wykonywania.

Dlaczego zadanie nie działa, choć polecenie działa ręcznie?

Cron uruchamia polecenia w skromniejszym środowisku niż interaktywny terminal. Może nie znać tych samych zmiennych środowiskowych, ścieżek do programów ani ustawień powłoki. Dlatego używaj pełnych ścieżek i nie zakładaj, że katalog roboczy będzie katalogiem skryptu.

Jeśli program wymaga uruchomienia z konkretnego katalogu, wpis może wyglądać tak:

0 6 * * * cd /home/anna/aplikacja && /usr/bin/python3 raport.py

Gdy zadanie nie daje wyniku, sprawdź kolejno: działanie usługi cron, konto wykonujące zadanie, uprawnienia, ścieżki, wymagane zmienne oraz dzienniki systemowe i aplikacyjne. Sam brak komunikatu błędu nie dowodzi sukcesu — skrypt powinien zwracać informację o niepowodzeniu i umożliwiać weryfikację efektu.

Godzina wykonania zależy również od konfiguracji strefy czasowej. Potwierdź ją na serwerze lub w panelu hostingu, zwłaszcza jeśli oczekujesz działania według czasu polskiego. Przy zmianach czasu zachowanie zadań przypadających na pominiętą lub powtórzoną godzinę zależy od implementacji.

Jakie ograniczenia ma cron?

Klasyczny cron zasadniczo nie nadrabia uruchomień pominiętych podczas wyłączenia serwera. Nie zapobiega też automatycznie nakładaniu się zadań: jeśli skrypt działa 20 minut, a startuje co 10 minut, mogą działać jednocześnie dwie jego kopie. Przy operacjach na wspólnych danych zastosuj blokadę, np. mechanizm flock dostępny w wielu systemach Linux.

Do zadań wymagających nadrabiania przerw można rozważyć anacron lub odpowiednio skonfigurowane timery systemd. Gdy potrzebujesz kolejkowania i ponawiania nieudanych operacji, lepszym rozwiązaniem może być kolejka zadań.

Nie myl też systemowego crona z WP-Cronem w WordPressie. WP-Cron domyślnie sprawdza zaplanowane zadania przy żądaniach do witryny, więc przy małym ruchu ich wykonanie może się opóźnić.

Pierwszą automatyzację uruchom na niekrytycznym zadaniu z dziennikiem wyników. Dopiero po potwierdzeniu rzeczywistego efektu powierz jej usuwanie danych lub wykonywanie kopii zapasowych.

Zobacz też: Co to jest 2FA?

Przeczytaj także

Dowiedz się, jak PHP-FPM obsługuje żądania PHP, czym różni się od serwera WWW i jak dobrać ustawienia procesów do ruchu oraz zasobów hostingu.
Poznaj BIND, otwarte oprogramowanie serwera DNS: sprawdź, jak obsługuje domeny, czym różnią się jego role i kiedy warto samodzielnie go wdrożyć.
Poznaj najważniejsze Security Headers, ich rolę w ochronie strony oraz sposób sprawdzania i wdrażania nagłówków bez blokowania potrzebnych funkcji.