Как запустить cronjob каждые X минут?
Я запускаю PHP script в 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("[email protected]", $subject, $message, "From: $from\n");
?>
Но я не получил электронное письмо через 30 минут с этой конфигурацией.
Ответы
Ответ 1
В файле crontab
следующие поля:
- минута часа.
- час дня.
- день месяца.
- месяц года.
- день недели.
Итак:
10 * * * * blah
означает выполнение blah
через 10 минут каждый час.
Если вы хотите каждые пять минут, используйте либо:
*/5 * * * * blah
означает каждую минуту, но только каждую пятую, или:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah
для старых cron
исполняемых файлов, которые не понимают нотацию */x
.
Если после этого все еще не работает, измените команду на что-то вроде:
date >>/tmp/debug_cron_pax.txt
и отслеживать этот файл, чтобы гарантировать, что что-то записывается каждые пять минут. Если это так, что-то не так с вашими PHP-скриптами. Если нет, что-то не так с вашим демоном cron
.
Ответ 2
Ваш CRON должен выглядеть следующим образом:
*/5 * * * *
CronWTF действительно полезно, когда вам нужно проверить свои настройки CRON.
Возможно, неплохо было бы вывести вывод в файл журнала, чтобы вы могли увидеть, что ваш script тоже бросает какие-либо ошибки, поскольку вы не увидите их в своем терминале.
Также попробуйте использовать shebang в верхней части вашего PHP файла, поэтому система знает, где найти PHP. Например:
#!/usr/bin/php
таким образом вы можете назвать все это следующим образом
*/5 * * * * php /path/to/script.php > /path/to/logfile.log
Ответ 3
Вы устанавливаете свой cron для запуска на 10-й минуте в каждый час.
Чтобы установить значение every 5 mins
на */5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1
Ответ 4
2 шага, чтобы проверить, работает ли cronjob:
И проверьте, отображается ли какая-либо ошибка.
Ответ 5
# .---------------- 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
Ответ 6
Если вы хотите запускать 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
нет точности до секунды