
Zadania cron: automatyzacja powtarzalnych skryptów
Każdy projekt po kilku miesiącach dorabia się listy czynności wykonywanych ręcznie: eksport zamówień, czyszczenie tabeli logów, kopia bazy, odpytanie API dostawcy. Cron jest tym mechanizmem, który przejmuje je wszystkie i wykonuje o ustalonej porze, niezależnie od tego, czy ktoś jest przy komputerze. Poniżej znajdziesz składnię, kilka gotowych harmonogramów i listę pułapek, przez które zadanie wygląda na ustawione, a w rzeczywistości nie robi nic.
Pięć gwiazdek, czyli cała składnia
Wpis w harmonogramie zaczyna się od pięciu pól określających czas, po których następuje polecenie do wykonania:
minuta godzina dzień_miesiąca miesiąc dzień_tygodnia polecenie
Zakresy są następujące: minuta 0 do 59, godzina 0 do 23, dzień miesiąca 1 do 31, miesiąc 1 do 12, dzień tygodnia 0 do 7 (niedziela to zarówno 0, jak i 7). Gwiazdka oznacza każdą wartość, przecinek wylicza kilka wartości, myślnik tworzy zakres, a ukośnik zadaje krok.
Kilka harmonogramów, które pokrywają większość realnych potrzeb:
0 3 * * * codziennie o 3:00
*/15 * * * * co 15 minut
0 2 * * 1 w każdy poniedziałek o 2:00
30 4 1 * * pierwszego dnia miesiąca o 4:30
0 9-17 * * 1-5 co godzinę od 9 do 17, od poniedziałku do piątku
Zwróć uwagę na */15. Ludzie intuicyjnie piszą tam 15, co oznacza piętnastą minutę każdej godziny, czyli zadanie uruchamiane raz na godzinę zamiast czterech razy.
Dlaczego skrypt działa w przeglądarce, a w cronie nie
To najczęstsze zgłoszenie związane z zadaniami cyklicznymi i prawie zawsze wynika z jednej z trzech rzeczy.
Inne środowisko PHP. Wersja uruchamiana z linii poleceń bywa inna niż ta obsługująca stronę, a wraz z nią inny jest zestaw rozszerzeń i limitów. Jeśli panel pozwala wybrać interpreter, wskaż go w poleceniu jawnie zamiast polegać na domyślnym. Sam wybór wersji opisaliśmy we wpisie o konfiguracji wersji PHP na hostingu.
Ścieżki względne. Cron uruchamia polecenie z katalogu domowego, a nie z katalogu skryptu. Zapis require 'config.php' zadziała w przeglądarce i przestanie działać w harmonogramie. Używaj ścieżek bezwzględnych albo ustaw katalog roboczy na początku polecenia.
Brak zmiennych środowiskowych. Sesja crona jest uboższa niż sesja logowania, więc zmienne ustawione w plikach powłoki mogą być niedostępne. Jeśli skrypt potrzebuje klucza API ze zmiennej, przekaż ją bezpośrednio w poleceniu albo wczytaj z pliku.
WP-Cron to nie jest cron systemowy
WordPress ma własny harmonogram i to bywa mylące. WP-Cron nie działa w tle: uruchamia się przy okazji wizyty na stronie. Na serwisie z małym ruchem zaplanowana publikacja albo aktualizacja wtyczki potrafi więc wystartować z kilkugodzinnym opóźnieniem, a na serwisie z dużym ruchem ten sam mechanizm dokłada pracy przy każdym żądaniu.
Standardowe rozwiązanie wygląda tak: wyłączasz wywoływanie WP-Cron przez odwiedziny, dopisując do wp-config.php linię define('DISABLE_WP_CRON', true);, a następnie dodajesz zadanie systemowe wywołujące wp-cron.php co kilka minut. Zyskujesz przewidywalne pory i zdejmujesz narzut z ruchu użytkowników.
Zadanie, które przestało działać, i nikt tego nie zauważył
Cron jest cichy z założenia. Jeśli skrypt zacznie się wywalać, nie dostaniesz o tym żadnej informacji, chyba że sam ją sobie zorganizujesz. Minimalna wersja to przekierowanie wyniku do pliku:
0 3 * * * /usr/bin/php /home/user/skrypty/eksport.php >> /home/user/logi/eksport.log 2>&1
Zapis 2>&1 jest tu najważniejszy, bo kieruje do tego samego pliku również komunikaty błędów. Bez niego log wygląda na zdrowy, mimo że zadanie kończy się wyjątkiem. Raz w miesiącu warto do tego pliku zajrzeć albo dopisać do skryptu prosty alert, który wyśle wiadomość, gdy coś pójdzie nie tak. Jeśli zadanie robi kopię bazy, przećwicz też odtwarzanie, a nie tylko tworzenie kopii, zgodnie z tym, co opisaliśmy we wpisie o backupie bazy danych.
Kiedy potrzebujesz własnego serwera
Zadania cron na hostingu współdzielonym mają z natury ograniczenia: krótszy dozwolony czas wykonania, mniej pamięci na proces i brak możliwości instalowania własnych narzędzi. Dopóki zadania są lekkie, nie ma to znaczenia.
Sytuacja zmienia się, gdy skrypt przetwarza duży plik, generuje raporty albo działa kilkanaście minut. Wtedy sensowniejszy jest serwer VPS z dostępem root i pełną wirtualizacją KVM, na którym crontab -e masz do dyspozycji bez pośrednictwa panelu, a limity ustawiasz sam. Do połączenia przyda się wiedza z wpisu o protokole SSH.
Podsumowanie
Cron zwraca czas w proporcji, która rzadko się zdarza: pięć minut na konfigurację, godziny oszczędzone przez kolejne lata. Zacznij od jednej czynności, którą wykonujesz ręcznie co tydzień, dopisz do niej log i sprawdź po kilku dniach, czy plik rośnie.
Jeśli serwis mieści się w ramach pakietu, wystarczy hosting RapidDC z panelem DirectAdmin. Gdy zadania zaczynają być cięższe od samej strony, przenieś je na VPS z dostępem root.
FAQ – najczęściej zadawane pytania o zadania cron
Jak często można uruchamiać zadanie cron?
Technicznie co minutę, ale rzadko ma to sens. Jeśli poprzednie uruchomienie jeszcze się nie skończyło, zadania zaczną na siebie nachodzić i obciążać serwer. Dla większości zastosowań wystarczy co 15 minut, a dla operacji nocnych raz na dobę.
Co zrobić, gdy cron uruchamia skrypt dwa razy?
Najczęściej oznacza to dwa wpisy: jeden dodany w panelu, drugi w crontabie użytkownika. Sprawdź oba miejsca. Jeśli wpis jest jeden, dodaj do skryptu blokadę na pliku, która przerwie działanie, gdy poprzednia instancja jeszcze pracuje.
Czy wyłączenie WP-Cron jest bezpieczne?
Tak, pod warunkiem że w zamian ustawisz zadanie systemowe wywołujące wp-cron.php. Samo wyłączenie bez zamiennika zatrzyma zaplanowane publikacje, automatyczne aktualizacje i część funkcji wtyczek.
W jakiej strefie czasowej działa cron?
W strefie ustawionej na serwerze, która nie musi odpowiadać strefie serwisu ani Twojej. Przed ustawieniem zadań nocnych sprawdź czas systemowy poleceniem date, inaczej kopia zaplanowana na trzecią w nocy może wykonać się w środku dnia.
Jak przetestować zadanie bez czekania na wyznaczoną godzinę?
Uruchom to samo polecenie ręcznie z linii poleceń, dokładnie w tej formie, w jakiej trafiło do harmonogramu, razem ze ścieżkami bezwzględnymi. Jeśli zadziała ręcznie i nie zadziała w cronie, przyczyną jest środowisko, a nie sam skrypt.
Artykuł powstał z wykorzystaniem narzędzi sztucznej inteligencji (AI) pod nadzorem zespołu RapidDC. Grafika ilustracyjna została wygenerowana przez AI.
