Як запускати cronjob кожні X хвилин?


94

Я запускаю 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
Savan Paun

Іноді php-cli не хоче працювати лише тому, що ви не встановили поточний часовий пояс у своєму php.ini, навіть якщо не використовуєте дату.
T00rk

Це cromail.phpчи cronmail.php?
Біффен

cromail.php лише для тестування
Саван Паун

Відповіді:


165

У 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демоном щось не так .


я оновлюю * / 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? Проблема насправді може бути в самому сценарії.
Gary Jones

5

Ви налаштовуєте свій 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, але все одно не отримую електронного листа
Savan Paun,

@ 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). Я оновив відповідь
kvantour

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

Щоб встановити х хвилин, нам потрібно встановити х хвилин у 1-му аргументі, а потім шлях вашого сценарію

Протягом 15 хв

*/15 * * * *  /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1

1
Це НЕ запускає такси КОЖНІ х (15) хвилин. Він запускає його на х (1) хвилин через кожну повну годину.
silverdr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.