如何每X分钟执行一次cronjob?


94

我正在cronjob中运行PHP脚本,我想每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
您的绝对路径可能不正确
Rene Pot

请建议我正确的路径,将我的PHP文件cromail.php放入根目录
-mydomain.in/cromail.php

有时,即使您不使用日期,php-cli也不希望仅仅因为您没有在php.ini中设置当前时区而工作。
T00rk 2014年

cromail.php还是cronmail.php
Biffen 2014年

cromail.php仅用于测试
Savan Paun 2014年

Answers:


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不接收电子邮件
萨文Paun

我也使用这里提到的命令,但是它不起作用,因为它后面有一个return语句。确保不要在语句的结尾加上return和注释,当创建新的cron时,它会显示“ crontab:安装新的crontab”消息。
damndemon

31

您的CRON应该如下所示:

*/5 * * * *

当您需要测试CRON设置时,CronWTF确实有用。

将输出通过管道传输到日志文件中是个好主意,这样您就可以查看脚本是否也抛出了任何错误-因为您不会在终端中看到它们。

另外,请尝试在PHP文件顶部使用shebang,以便系统知道在哪里可以找到PHP。如:

#!/usr/bin/php

这样你就可以像这样称呼整个事情

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


我更新* / 5 * * * * mydomain.in/cronmail.php>的/ dev / null的2>&1不接收电子邮件
萨文Paun

2
您是否尝试过手动而不是通过cron运行脚本?问题实际上可能出在脚本本身上。
加里·琼斯

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不接收电子邮件
萨文Paun

@ user3705511您忘记通过php运行它-缺少usr/bin/php部分
Justinas 2014年

添加了* / 5 * * * * usr / bin / php / mydomain.in / cronmail.php> / dev / null 2>&1,但仍未收到电子邮件
Savan Paun 2014年

@ 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
Savan Paun 2014年

5

如果您想每n分钟运行一次cron ,则取决于的值,有一些可能的选项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。假设我们要在Marty McFly到达Riverdale时第一次开始运行该命令,然后每隔一n分钟重复一次。

% date -d '2015-10-21 07:28:00' +%s 
1445412480

为了使cronjob 42在`2015-10-21 07:28:00'之后的第nd分钟运行,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时间不受leap秒影响

备注: cron没有亚秒精度


m/n符号在我的系统上似乎不起作用(Debian 9,Ubuntu 16.04)。仅*/n适用。例如,5/54/10给予Error: bad minute; while reading /etc/crontab(3.0pl1-128ubuntu2在Ubuntu使用Cron诉)的系统日志。此m / n符号是否已被放弃,或者仅在某些系统中可用?
mivk

@mivk感谢您指出这一点。我这是一个错误。应该已经读过了m-59/n。只有一个范围可以具有步长。(请参阅man 5 crontab)。我已经更新了答案
kvantour

3

检查cronjob是否正常工作的2个步骤:

  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分钟,然后设置脚本的路径

15分钟

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

1
这不会每隔x(15)分钟运行一次taks。它每隔一小时就会在x(1)分钟内运行一次。
silverdr '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.