Jak ustawić zadania CRON?

Artykuł dla panelu:
direct_Admin
server_Panel
WebAs

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 „Zadania CRON” w sekcji Pozostałe ustawieniauzupeł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.6, 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/php52
/usr/local/bin/php53
/usr/local/bin/php54
/usr/local/bin/php55
/usr/local/bin/php56
/usr/local/bin/php70
/usr/local/bin/php71
/usr/local/bin/php72
/usr/local/bin/php73
/usr/local/bin/php80

(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.

Niekiedy zachodzi potrzeba wywołania adresu URL z konkretnym parametrem, np. na potrzeby synchronizacji modułu z zewnętrzną platformą. Aby zadanie CRON było uruchamiane z konkretnym parametrem to cały adres URL należy umieścić w cudzysłowie, np.:

wget -q -O - "https://NAZWA_DOMENY/modules/x13allegro/sync.php?token=ABCDE" >>/dev/null 2>&1

W powyższym przykładzie przekazywany jest parametr token z wartością ABCDEF. Wartość ta jest tylko przykładem, prawidłową wartość należy skopiować z modułu w zapleczu strony.

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.

Zadania cykliczne cron


Cron to mechanizm pozwalający na automatyczne uruchamianie programów cyklicznie lub o określonej porze.

Program ten umożliwia operacje takie jak synchronizacja stanów magazynowych z bazą danych sklepu internetowego lub pobranie aktualnych kursów walut.

Skrypty PHP mogą być wywoływane w dwóch trybach CLI oraz CGI. Skrypty CLI to inaczej programy wywoływane z linii poleceń. CGI to skrypty wywoływane w środowisku przeglądarki www. W większości przypadków zadziałają oba wywołania, ale czasami skrypt musi być wywołany w konkretnym trybie. W takiej sytuacji w sekcji nazwa programu należy podać jedną z poniższych ścieżek. To klient powinien wiedzieć w jakim trybie ma być wywoływany skrypt PHP. Jeżeli nie wie to powinien to ustalić u twórcy oprogramowania.

CLI

/usr/local/php5.2/bin/php
/usr/local/php5.3/bin/php
/usr/local/php5.4/bin/php
/usr/local/php5.5/bin/php
/usr/local/php5.6/bin/php
/usr/local/php7.0/bin/php
/usr/local/php7.4/bin/php
/usr/local/php8.0/bin/php

CGI

/usr/local/php5.2/bin/php-cgi
/usr/local/php5.3/bin/php-cgi
/usr/local/php5.4/bin/php-cgi
/usr/local/php5.5/bin/php-cgi
/usr/local/php5.6/bin/php-cgi
/usr/local/php7.0/bin/php-cgi
/usr/local/php7.4/bin/php-cgi
/usr/local/php8.0/bin/php-cgi

Skrypty PHP wywoływane przez crona korzystają z domyślnego php.ini na serwerze. Aby wykorzystany został własny plik php.ini (np. z włączonym IonCubem) musi zostać on podany w argumentach. Służy do tego parametr -c:

-c /katalog/katalog/php.ini


Aby utworzyć nowe zadanie cron należy zalogować się do panelu administracyjnego

1. W kolejnym kroku klikamy na zakładkę serwer www i wybieramy polecenie „Zadania cron”.


2. W otwartym formularzu wybieramy przycisk „Dodaj zadanie”.

3. Wprowadzamy niezbędne dane.

Określamy harmonogram, wg którego będzie uruchamiany skrypt.


Przykłady:

  • „Uruchamiaj codziennie co 15 minut”
  • „Uruchamiaj raz na dobę, 5 minut po północy”


   
W polu „polecenie” wpisujemy pełną ścieżkę do pliku:

/usr/bin/php70 /sciezka/do/plik.php


Alternatywą dla ścieżki może być adres URL do skryptu.

Zaznaczamy checkbox „URL” i wybieramy protokół przesyłania dokumentów hipertekstowych (http:// lub https://)

Na liście „host” wybieramy właściwy URL, a w polu „polecenie” podajemy /usr/bin/curl.


Adres URL może zawierać parametry podobnie jak ma to miejsce w klasycznej przeglądarce internetowej, tak więc dozwolone są również adresy typu

www.przykladowastrona.com/cron/plik.php

W przypadku gdyby powyższy sposób okazał się nieskuteczny, istnieje alternatywna metoda opisana poniżej.

Jeśli chcemy wywołać skrypt po adresie www, nie zaznaczamy checkboxa „URL”

lecz wpisujemy odpowiednie ustawienie w zakładce „polecenie”

np.

/bin/sh -c '/usr/bin/curl --silent http://przykladowastrona.com/cron/plik.php &>/dev/null'

Domyślną lokalizacją zapisu wyniku zadania cron, jest następująca ścieżka:
/tmp/sh.out

Jeżeli wynik, crona ma być zapisywany do innej lokalizacji, można określić do niej ścieżkę
wpisując ją w polu: Log stdout

Błędy lub komunikaty zwrócone przez skrypt dotyczące danego zadania można znaleźć w folderze tmp na przestrzeni na której zostało dodane zadanie cron. Pliki mają nazwę taką jak wywoływany program i rozszerzenia err lub out.

Aby uruchamiać cronem skrypt napisany przez siebie (np skrypt powłoki sh, lub perl), należy pamiętać o nadaniu mu prawa do wykonywania (minimum 744).

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 zadania cron, jest nim zawsze główny katalog serwera. Rozwiązaniem jest rezygnacja z względnych ścieżek w kodzie lub inteligentna kontrola tych ścieżek na podstawie lokalizacji uruchamianego pliku.

  1. Zaloguj się do panelu klienta
  2. Po lewej stronie rozwiń z menu „Twoje usługi”,
  3. wybierz zakładkę Hosting.
  4. Kliknij w przycisk „Zaloguj do WebAs”, po prawej stronie na liście, przy wybranej usłudze a zostaniesz  automatycznie przekierowany do swojego panelu zarządzania serwerem
  5. z menu wybierz Usługi > CRON,
  6. a następnie „Nowe zadanie”. W tym miejscu należy dodać nowe zadanie.
  7. Formularz umożliwia konfigurację wpisu zarówno w sposób uproszczony poprzez wybranie odpowiednich opcji, jak i dla użytkowników zaawansowanych poprzez wpisanie pełnego polecenia, analogicznie jak w crontab, gdzie konieczne jest wybranie trybu edycji zaawansowanej.
  8. Przykładowo dodane zadanie:

    Co 2 godziny, w każdej 30 minucie będzie wykonywał się import danych z hurtowni. Możemy także zablokować wykonywanie zadania za pomocą checkbox’a po prawej stronie w kolumnie Blokada.

Więcej na temat Cron:
https://pl.wikipedia.org/wiki/Cron
https://pl.wikipedia.org/wiki/Crontab
https://crontab.guru/
 
UWAGA
Obciążenie generowane przez zadania CRON jest uwzględnione w obciążeniu generowanym przez konto FTP, do którego są one przypisane.