Uruchamiam skrypt PHP w cronjob i chcę wysyłać e-maile co 5 minut
Mój obecny (crontab) cronjob:
10 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Plik cronmail.php jest następujący:
<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("[email protected]", $subject, $message, "From: $from\n");
?>
Ale nie otrzymałem e-maila w ciągu 30 minut przy tej konfiguracji.
cromail.php
czycronmail.php
?Odpowiedzi:
W
crontab
pliku są to pola:Więc:
10 * * * * blah
oznacza wykonywanie
blah
co 10 minut po każdej godzinie.Jeśli chcesz co pięć minut, użyj:
*/5 * * * * blah
czyli co minutę, ale tylko co piątą, lub:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah
dla starszych
cron
plików wykonywalnych, które nie rozumieją*/x
notacji.Jeśli po tym nadal wydaje się nie działać, zmień polecenie na coś takiego:
i monitoruj ten plik, aby upewnić się, że coś jest zapisywane co pięć minut. Jeśli tak, coś jest nie tak z Twoimi skryptami PHP. Jeśli nie, coś jest nie tak z twoim
cron
demonem.źródło
Twój CRON powinien wyglądać tak:
*/5 * * * *
CronWTF jest naprawdę przydatny, gdy chcesz przetestować ustawienia CRON.
Dobrym pomysłem może być przesłanie danych wyjściowych do pliku dziennika, abyś mógł sprawdzić, czy twój skrypt również nie generuje żadnych błędów - ponieważ nie zobaczysz ich w terminalu.
Spróbuj także użyć znaku shebang na początku pliku PHP, aby system wiedział, gdzie znaleźć PHP. Jak na przykład:
#!/usr/bin/php
w ten sposób możesz to nazwać w ten sposób
*/5 * * * * php /path/to/script.php > /path/to/logfile.log
źródło
Ustawiasz crona tak, aby działał co 10 minuty co godzinę.
Aby ustawić
every 5 mins
zmianę na*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1
źródło
usr/bin/php
część*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Jeśli chcesz uruchamiać crona co
n
minuty, istnieje kilka możliwych opcji w zależności od wartościn
.n
dzieli 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)Tutaj rozwiązanie jest proste dzięki zastosowaniu
/
notacji:# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) # | | | | | # * * * * * command to be executed m-59/n * * * * command
W powyższym
n
oznacza wartośćn
im
przedstawia wartość mniejszą niżn
lub*
. Spowoduje to wykonanie polecenia w minutachm,m+n,m+2n,...
n
NIE dzieli 60Jeśli
n
nie dzieli 60, nie można tego zrobić czysto za pomocą crona, ale jest to możliwe. Aby to zrobić, musisz umieścić test w cronie, w którym test sprawdza czas. Najlepiej jest to zrobić patrząc na znacznik czasu UNIX, czyli całkowitą liczbę sekund, które upłynęły od tego czasu1970-01-01 00:00:00 UTC
. Powiedzmy, że chcemy rozpocząć uruchamianie polecenia za pierwszym razem, gdy Marty McFly przybył do Riverdale, a następnie powtarzać je con
minuty później.% date -d '2015-10-21 07:28:00' +%s 1445412480
Aby cronjob działał co
42
nd minutę po `2015-10-21 07:28:00 ', plik crontab wyglądałby następująco:# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) # | | | | | # * * * * * command to be executed * * * * * minutetestcmd "2015-10-21 07:28:00" 42 && command
ze
minutetestcmd
zdefiniowanym jako#!/usr/bin/env bash starttime=$(date -d "$1" "+%s") # return UTC time now=$(date "+%s") # get the amount of minutes (using integer division to avoid lag) minutes=$(( (now - starttime) / 60 )) # set the modulo modulo=$2 # do the test (( now >= starttime )) && (( minutes % modulo == 0 ))
Uwaga: na czas UNIX nie mają wpływu sekundy przestępne
Uwaga:
cron
nie ma dokładności poniżej sekundyźródło
m/n
Notacja nie wydaje się działać na moim systemów (Debian 9, Ubuntu 16.04). Tylko*/n
działa. Na przykład5/5
lub4/10
dajError: bad minute; while reading /etc/crontab
w syslog (w Ubuntu z cron v. 3.0pl1-128ubuntu2). Czy ten zapis m / n został porzucony, czy jest dostępny tylko w niektórych systemach?m-59/n
. Tylko zakres może mieć wielkość kroku. (patrzman 5 crontab
). Zaktualizowałem odpowiedź2 kroki, aby sprawdzić, czy cronjob działa:
Ręcznie uruchom polecenie php:
/ usr / bin / php /mydomain.in/cromail.php
I sprawdź, czy jest wyświetlany jakiś błąd
źródło
# .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
Aby ustawić x minut, musimy ustawić x minut w pierwszym argumencie, a następnie ścieżkę twojego skryptu
Przez 15 minut
*/15 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
źródło