Я запускаю PHP-скрипт в cronjob и хочу отправлять электронные письма каждые 5 минут
Мой текущий (crontab) cronjob:
10 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Cronmail.php выглядит следующим образом:
<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("myemail@gmail.com", $subject, $message, "From: $from\n");
?>
Но я не получал письмо с этой конфигурацией в течение 30 минут.
cromail.php
илиcronmail.php
?Ответы:
В
crontab
файле есть следующие поля:Так:
10 * * * * blah
означает выполнение
blah
каждые 10 минут каждый час.Если вы хотите каждые пять минут, используйте:
*/5 * * * * blah
означает каждую минуту, но только каждую пятую, или:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah
для более старых
cron
исполняемых файлов, которые не понимают*/x
нотацию.Если после этого он по- прежнему не работает, измените команду на что-то вроде:
и отслеживайте этот файл, чтобы что-то записывать каждые пять минут. Если да, то с вашими PHP-скриптами что-то не так. Если нет, то с вашим
cron
демоном что-то не так .источник
Ваш CRON должен выглядеть так:
*/5 * * * *
CronWTF действительно полезен , когда вам нужно проверить настройки CRON.
Может быть хорошей идеей передать вывод в файл журнала, чтобы вы могли видеть, выдает ли ваш скрипт какие-либо ошибки, поскольку вы не увидите их в своем терминале.
Также попробуйте использовать shebang в верхней части файла PHP, чтобы система знала, где найти PHP. Такие как:
#!/usr/bin/php
таким образом вы можете назвать все это так
*/5 * * * * php /path/to/script.php > /path/to/logfile.log
источник
Вы настраиваете свой cron на запуск 10-й минуты каждый час.
Чтобы
every 5 mins
изменить его на*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1
источник
usr/bin/php
часть*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Если вы хотите запускать cron каждую
n
минуту, есть несколько возможных вариантов в зависимости от значенияn
.n
делит 60 (1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)Здесь решение простое, если использовать
/
обозначения:# 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
В приведенном выше примере
n
представляет значениеn
иm
представляет значение меньшеn
или*
. Это выполнит команду в минутахm,m+n,m+2n,...
n
НЕ делит 60Если
n
не делит 60, вы не можете сделать это чисто с помощью cron, но это возможно. Для этого нужно поставить в cron тест, где тест проверяет время. Лучше всего это делать, глядя на временную метку UNIX, общее количество секунд с тех пор1970-01-01 00:00:00 UTC
. Допустим, мы хотим запустить команду в первый раз, когда Марти Макфлай прибыл в Ривердейл, а затем повторять ее каждыеn
несколько минут.% date -d '2015-10-21 07:28:00' +%s 1445412480
Чтобы cronjob запускался каждую
42
ую минуту после `2015-10-21 07:28:00 ', crontab будет выглядеть так:# 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
с
minutetestcmd
определенным как#!/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 ))
Примечание: на время UNIX не влияют дополнительные секунды.
Примечание:
cron
не имеет субсекундной точностиисточник
m/n
Обозначения , кажется, не работает в моей системы (Debian 9, Ubuntu 16,04). Только*/n
работает. Например,5/5
или4/10
датьError: bad minute; while reading /etc/crontab
в syslog (в Ubuntu с cron v. 3.0pl1-128ubuntu2). Отказ от этой записи m / n или она доступна только в некоторых системах?m-59/n
. Только диапазон может иметь размер шага. (см.man 5 crontab
). Я обновил ответ2 шага, чтобы проверить, работает ли cronjob:
Вручную запустите команду php:
/ usr / bin / php /mydomain.in/cromail.php
И проверьте, отображается ли какая-либо ошибка
источник
# .---------------- 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
Чтобы установить x минут, нам нужно установить x минут в 1-м аргументе, а затем путь к вашему скрипту
На 15 минут
*/15 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
источник