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

95

Я запускаю 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 минут.

Саван Паун
источник
2
Ваш абсолютный путь, вероятно, неверен
Рене Пот
пожалуйста, предложите мне правильный путь, мой php файл cromail.php находится в корневом каталоге - mydomain.in/cromail.php
Саван Паун
Иногда php-cli не хочет работать только потому, что вы не установили текущий часовой пояс в php.ini, даже если вы не используете дату.
T00rk
Это cromail.phpили cronmail.php?
Biffen
cromail.php только для тестирования
Саван Паун

Ответы:

170

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

Paxdiablo
источник
Я обновляю * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Не
получаю
Я также использовал упомянутую здесь команду, но она не работала, потому что после нее был оператор return. Убедитесь, что не завершили оператор return, а также примечанием, поскольку при создании нового cron отображается сообщение «crontab: установка нового crontab».
damndemon
31

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

*/5 * * * *

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

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

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

#!/usr/bin/php

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

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

Гэри Джонс
источник
Я обновляю * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Не
получаю
2
Вы пробовали запускать скрипт вручную, а не через cron? На самом деле проблема может быть в самом скрипте.
Гэри Джонс
6

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

Юстинас
источник
Я обновляю * / 5 * * * * mydomain.in/cronmail.php> / dev / null 2> & 1 Не
получаю
@ user3705511 Вы забыли запустить его через php - недостающая usr/bin/phpчасть
Justinas
добавлено * / 5 * * * * usr / bin / php / mydomain.in / cronmail.php> / dev / null 2> & 1, но по-прежнему не
приходит
@ user3705511*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
Justinas
обновлено, но по-прежнему не приходит электронная почта * / 5 * * * * usr / bin / php / mydomain.in/cronmail.php> / dev / null 2> & 1
Саван Паун
5

Если вы хотите запускать 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 или она доступна только в некоторых системах?
mivk
@mivk Спасибо, что указали на это. Это была ошибка с моей стороны. Надо было прочитать m-59/n. Только диапазон может иметь размер шага. (см. man 5 crontab). Я обновил ответ
квантур
3

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

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

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

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

Пол Гирагосян
источник
3
# .---------------- 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
Джавид Шакил
источник
1
Это НЕ запускает таксы КАЖДЫЕ x (15) минут. Он запускает его x (1) минут через каждый полный час.
silverdr 01