Zadania CRON – opis, dodawanie zadań, sprawdzanie działania

CRON jest mechanizmem okresowego uruchamiania poleceń na serwerze.

W tym poradniku dowiesz się:

  1. Jak dodać zadanie
  2. Jak ustawić czas uruchamiania się zadania
  3. Jaką komendą uruchamiać zadanie
  4. Jak sprawdzić czy CRON działa
  5. Jak sprawdzić czy działa zadanie dodane do CRONa
  6. Jak zmierzyć czas pracy zadania dodanego do CRONa
  7. Jakie są podstawowe problemy związane z CRONem

1. Jeśli chcesz dodać zadanie do CRONa:

  • zaloguj się do panelu Direct Admin (dane do logowania są przesyłane mailem powitalnym)
  • wybierz dowolną domenę z obecnych na liście (jeśli jest wybór)
  • wybierz w menu „Zadania CRON” w sekcji „Pozostałe ustawienia”
  • uzupełnij pola czasu wykonania zadania (minuta, godzina, dzień miesiąca, miesiąc, dzień tygodnia)
  • uzupełnij pole komendy do wykonania
  • kliknij „Dodaj”

2. Ustawianie czasu uruchomienia zadania

Jako czasy wykonywania zadania domyślnie ustawione są znaki gwiazdek („*”) które oznaczają uruchamianie zadania co minutę – należy to zmienić aby nie przeciążać serwera.

  • Jeśli zadanie CRONa ma być uruchamiane raz na godzinę, należy zamienić domyślny znak gwiazdki w minutach na pojedynczą cyfrę lub liczbę z podanego przedziału – np 0. Jeśli ma być uruchamianych więcej zadań CRONa co godzinę, dla uniknięcia przeciążenia serwera, zalecamy ustawienie każdemu kolejnemu zadaniu innej minuty uruchomienia:
    • 0 dla pierwszego
    • 5 dla drugiego
    • 10 dla trzeciego
    • analogicznie, dla każdego kolejnego wielokrotność 5
  • Jeśli zadanie CRONa ma być uruchamiane co każde 15 minut, można ustawić minuty na */15 lub ręcznie wskazać czasy 0,15,30,45 w polu minut pozostawiając gwiazdki w pozostałych polach. W przypadku gdy jest dodanych więcej niż jedno zadanie CRONa, które ma być wykonywane co 15 minut, zalecamy tą drugą metodę, przy czym dla każdego kolejnego zadania do wykonania ustawić kolejne minuty:
    • 0,15,30,45 dla pierwszego
    • 1,16,31,46 dla drugiego
    • 2,17,32,47 dla trzeciego
    • analogicznie dla kolejnych
  • Analogicznie ustawia się czas uruchomienia zadania dla godzin, dni, miesięcy i dni tygodnia
    Czas uruchamiania zadań CRONa można ustawiać również inaczej – nie mniej powyższe nadają się do zastosowania w praktycznie każdym przypadku.

Czas uruchamiania zadań CRONa można ustawiać również inaczej – nie mniej powyższe nadają się do zastosowania w praktycznie każdym przypadku.

3. Jaką komendą uruchamiać zadanie?

Kod, który ma być uruchamiany za pomocą CRONa, można wywoływać w różny sposób, lecz za każdym razem konieczne jest uzupełnienie pola Komenda we właściwy sposób dostosowany do rodzaju uruchamianego kodu

Przykłady komendy uruchamiającej kod PHP lokalnie na serwerze:

php  /home/TWÓJ_LOGIN/nazwapliku.php

php  /home/TWÓJ_LOGIN/domains/NAZWA_DOMENY/public_html/cron.php

gdzie zamiast TWÓJ_LOGIN będzie login konta używany do logowania w panelu Direct Admin, do którego dodawane jest to zadanie, a NAZWA_DOMENY to nazwa domeny podpiętej pod konto.

Jeśli zadanie CRONa wygeneruje jakąkolwiek treść (np. błędy wykonania kodu lub samej komendy), która normalnie zostałaby zwrócona/wypisana (tak jak normalne wyniki poleceń zwracane na terminal), wszystko to zostanie wysłane na główną skrzynkę mailową – do której można się zalogować tak jak do każdej innej skrzynki mailowej, lecz logując się przy pomocy danych do logowania do Direct Admina.

Jeśli zadanie CRONa generuje jakąkolwiek treść, ale nie ma ona być gdziekolwiek wysyłana, na końcu komendy dodaje się:

>>/dev/null 2>&1

(będące również efektem naciśnięcia przycisku „Bez generowania maili o błędach itp” w menu zadań CRONa)

Jeśli zadanie będzie generować treść, ale mail główny nie będzie regularnie czyszczony przez użytkownika, po pewnym czasie komunikaty zapełnią przestrzeń konta. Dlatego zalecamy dodanie powyższego „przekierowania do kosza” na końcu komendy.

Jeżeli chcemy uruchomić kod znajdujący się na innym serwerze używamy:

lynx -dump http://domena/plik.php

Alternatywnie, zamiast lynxa, można użyć wget-a:

wget -q -O – http://domena/plik.php

gdzie http://domena/plik.php to adres normalnie wpisywany w przeglądarce WWW.
Jeśli to zadanie crona ma nic nie zwracać, pamiętajmy aby dodać >>/dev/null 2>&1 na końcu komendy.

Jeśli polecenie wget lub lynx nie działa wywołane krótką nazwą, trzeba użyć pełnej:

/usr/bin/wget
/usr/bin/lynx

Polecenie php uruchamia automatycznie domyślną wersję PHP na serwerze (na nowych 5.3, na starszych 5.2).
Jeśli ma być uruchomiona inna wersja, należy użyć właściwą pełną nazwę, odpowiadającą opcji wersji php w zaawansowanych ustawieniach PHP:

/usr/local/bin/php4
/usr/local/bin/php52
/usr/local/bin/php53
/usr/local/bin/php54

(na starszych serwerach ścieżki mogą się różnić)

Między nazwą polecenia (np php) i nazwą kodu nim uruchamianego zawsze musi być znak spacji.

Aby zadania się nie duplikowały, gdy jedno wykonuje się tak długo, że nie zdąży się zakończyć przed porą uruchomienia kolejny raz, można użyć dodatkowej komendy flock, podanej jako pierwszej w treści komendy. Nie zezwoli ona na uruchomienie kolejnego zadania jeżeli poprzednie się nie zakończy i jeszcze działa. Jest to zalecane za każdym razem dla zadań które muszą czekać na wykonanie czasochłonnej operacji, zwłaszcza tam gdzie pobierane są dane z zewnętrznych serwerów, ponieważ zapobiegnie przeciążeniom.

Przykład komendy:

flock -n /tmp/cron1234 lynx -dump http://domena/plik.php

gdzie cron1234 można zastąpić dowolnym ciągiem znaków tak aby każde zdanie miało swoją unikalną nazwę dla flock-a

4. Jak sprawdzić czy CRON działa?

Należy rozróżnić działanie CRONa od działania komendy uruchamianej przez niego.

Czy sam CRON działa sprawdzić można dodając zadanie:

date

i sprawdzając skrzynkę główną konta (dane do logowania jak do Direct Admina) lub:

date >> /home/TWÓJ_LOGIN/crontest.txt

i sprawdzając przez FTP/SSH czy istnieje plik i jaka jest jego zawartość
(gdzie zamiast TWÓJ_LOGIN będzie podany login konta używany do logowania w panelu Direct Admin, do którego dodawane jest to zadanie)

5. Jak sprawdzić czy działa zadanie dodane do CRONa?

Można to sprawdzić łatwo tylko jeśli zadanie generuje jakiekolwiek komunikaty potwierdzające jego wykonanie lub napotkanie błędów. Jeśli zadanie nie wykonuje się poprawnie i zwraca komunikat błędu, można usunąć   >>/dev/null 2>&1   z komendy i sprawdzić co przychodzi na maila głównego. Alternatywnie można zamienić >>/dev/null 2>&1 na:

>> /home/TWÓJ_LOGIN/wynik_zadania.txt 2>&1

i sprawdzając przez FTP/SSH podobnie jak dla sprawdzania samego CRONa

Jeśli błędy nie są generowane przez uruchamiany kod, pozostaje ręczna analiza przebiegu pracy kodu i to użytkownik musi zrobić samodzielnie.

6. Pomiar czasu pracy zadania dodanego do CRONa

Czas pracy kodu uruchamianego przez CRONa można mierzyć w ten sam sposób, jaki jest możliwy bezpośrednio z terminala – za pomocą polecenia time, przykład komendy:

time  php  /home/TWÓJ_LOGIN/nazwapliku.php

wynik pracy polecenia time w takim przypadku zostanie przesłany na maila głównego.

7. Znane problemy

Kod uruchamiany przez stronę www działa, ale nie działa wywołanie przez CRONa – zwracane są komunikaty o nieistniejących plikach i/lub błędnych ścieżkach:

Przyczyną jest stosowanie względnych ścieżek do plików w uruchamianym kodzie bez jednoczesnej weryfikacji lokalizacji względem uruchamianego kodu. W przypadku wywołań stron, katalog z którego uruchamiany jest kod jest tym, w którym się on znajduje, a w przypadku CRONa, jest nim zawsze główny katalog konta. Dlatego przez wywołaniem kodu poleceniem uruchamiającym go lokalnie, najlepiej jest dodać dodatkowe polecenie „przechodzące do katalogu z kodem” lub adekwatnie zmienić istniejące wg schematu:

cd KATALOG_Z_PLIKIEM && [wywołanie]

gdzie KATALOG_Z_PLIKIEM to lokalizacja w której znajduje się kod, przykład:

gdy normalnie jest:

php domains/nazwadomeny/public_html/cron.php

zamieniamy na:

cd domains/nazwadomeny/public_html && php cron.php

Alternatywnym rozwiązaniem jest rezygnacja z względnych ścieżek w kodzie lub inteligentna kontrola tych ścieżek na podstawie lokalizacji uruchamianego pliku.

Łukasz Bielawski
>
Łukasz Bielawski
Zawsze chętny do pomocy. Od 10 lat zajmuje się marketingiem internetowym, z naciskiem na działania seo oraz kampanie w ekosystemie Google Ads. Prywatnie pasjonat motoryzacji.