Подтвердить что ты не робот

Как запустить 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 минут с этой конфигурацией.

4b9b3361

Ответ 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:

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

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

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

Ответ 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 нет точности до секунды