Как запускать cronjob каждые X минут?

Я запускаю 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("[email protected]", $subject, $message, "From: $from\n");
?>

Но я не получал письма с этой конфигурацией в течение 30 минут.


person Savan Paun    schedule 09.09.2014    source источник
comment
ваш абсолютный путь, вероятно, неверен   -  person Rene Pot    schedule 09.09.2014
comment
пожалуйста, предложите мне правильный путь, мой php файл cromail.php находится в корневом каталоге - mydomain.in/cromail.php   -  person Savan Paun    schedule 09.09.2014
comment
Иногда php-cli не хочет работать только потому, что вы не установили текущий часовой пояс в своем php.ini, даже если вы не используете дату.   -  person T00rk    schedule 09.09.2014
comment
cromail.php только для тестирования   -  person Savan Paun    schedule 09.09.2014
comment
Есть ли у файла .php правильные разрешения? Правильные разрешения: 744.   -  person Nitin Nain    schedule 09.09.2014
comment
Путь php в порядке? Проверьте, /usr/bin/php с which php.   -  person fedorqui 'SO stop harming'    schedule 09.09.2014
comment
да @fedorqui путь к файлу php в порядке * / 5 * * * * usr / bin / php / mydomain.in/cronmail.php ›/ dev / null 2› & 1   -  person Savan Paun    schedule 09.09.2014
comment
Разрешения @NitinNain уже 744, но электронное письмо не получено с 10 минут   -  person Savan Paun    schedule 09.09.2014


Ответы (6)


В файле crontab есть следующие поля:

  • минута часа.
  • час дня.
  • день месяца.
  • месяц года.
  • день недели.

So:

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 что-то не так.

person paxdiablo    schedule 09.09.2014
comment
я обновляю * / 5 * * * * mydomain.in/cronmail.php ›/ dev / null 2› & 1 Не получаю письмо - person Savan Paun; 09.09.2014
comment
Я также использовал упомянутую здесь команду, но она не сработала, потому что после нее был оператор return. Убедитесь, что оператор не завершен return, а также примечанием, поскольку при создании нового cron отображается сообщение crontab: установка нового crontab. - person damndemon; 15.05.2020

Ваш CRON должен выглядеть так:

*/5 * * * *

CronWTF действительно полезен, когда вам нужно проверить настройки CRON.

Может быть хорошей идеей передать вывод в файл журнала, чтобы вы могли видеть, выдает ли ваш скрипт какие-либо ошибки, поскольку вы не увидите их в своем терминале.

Также попробуйте использовать shebang в верхней части файла PHP, чтобы система знала, где найти PHP. Такие как:

#!/usr/bin/php

таким образом вы можете назвать все это так

*/5 * * * * php /path/to/script.php > /path/to/logfile.log

person Gary Jones    schedule 09.09.2014
comment
я обновляю * / 5 * * * * mydomain.in/cronmail.php ›/ dev / null 2› & 1 Не получаю письмо - person Savan Paun; 09.09.2014
comment
Вы пробовали запускать скрипт вручную, а не через cron? Проблема на самом деле может быть в самом скрипте. - person Gary Jones; 09.09.2014

Вы настраиваете cron на запуск 10-й минуты каждый час.
Чтобы установить every 5 mins, измените значение на */5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1

person Justinas    schedule 09.09.2014
comment
я обновляю * / 5 * * * * mydomain.in/cronmail.php ›/ dev / null 2› & 1 Не получаю письмо - person Savan Paun; 09.09.2014
comment
@ user3705511 Вы забыли запустить его через php - отсутствует usr/bin/php часть - person Justinas; 09.09.2014
comment
добавлено * / 5 * * * * usr / bin / php / mydomain.in / cronmail.php ›/ dev / null 2› & 1, но по-прежнему не приходит электронное письмо - person Savan Paun; 09.09.2014
comment
@ user3705511 */5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1 - person Justinas; 09.09.2014
comment
обновлено, но по-прежнему не приходит электронная почта * / 5 * * * * usr / bin / php / mydomain.in/cronmail.php ›/ dev / null 2› & 1 - person Savan Paun; 09.09.2014
comment
@ user3705511 Затем запустите /usr/bin/php /mydomain.in/cromail.php в командной строке и проверьте, есть ли ошибки, если нет, то проверьте, правильный ли ваш путь - person Justinas; 09.09.2014
comment
я использую hostgator как-нибудь для проверки? - person Savan Paun; 09.09.2014
comment
Я думаю, что я использую имя пользователя или простую ошибку / usr / bin / php - person Savan Paun; 09.09.2014

Если вы хотите запускать 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 запускался каждую 42nd минуту после `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 не имеет субсекундной точности.

person kvantour    schedule 14.02.2019
comment
Обозначение m/n, похоже, не работает в моих системах (Debian 9, Ubuntu 16.04). Только */n работает. Например, 5/5 или 4/10 дают Error: bad minute; while reading /etc/crontab в системном журнале (в Ubuntu с cron v. 3.0pl1-128ubuntu2). Отказано ли от этого обозначения m / n или оно доступно только в некоторых системах? - person mivk; 29.06.2019
comment
@mivk Спасибо, что указали на это. Это была ошибка с моей стороны. Он должен был прочитать m-59/n. Только диапазон может иметь размер шага. (см. man 5 crontab). Я обновил ответ - person kvantour; 30.06.2019

2 шага, чтобы проверить, работает ли cronjob:

  1. Войдите на сервер с пользователем, который выполняет cronjob
  2. Вручную запустите команду php:

    / usr / bin / php /mydomain.in/cromail.php

И проверьте, отображается ли какая-либо ошибка

person Paul Giragossian    schedule 09.09.2014

# .---------------- 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
person Javeed Shakeel    schedule 22.01.2018
comment
Это НЕ запускает задачу КАЖДЫЕ x (15) минут. Он запускает его x (1) минут через каждый полный час. - person silverdr; 01.02.2018