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

时间:2014-09-09 09:02:46

标签: php cron cron-task

我在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分钟内没有收到有关此配置的电子邮件。

6 个答案:

答案 0 :(得分:107)

crontab文件中,字段为:

  • 分钟。
  • 一天中的小时。
  • 每月的一天。
  • 一年中的一个月。
  • 一周中的某一天。

所以:

10 * * * * blah

表示在每小时过去10分钟后执行blah

如果您每五分钟一次,请使用:

*/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守护进程出现了问题。

答案 1 :(得分:25)

你的CRON应该是这样的:

*/5 * * * *

当您需要测试CRON设置时,

CronWTF非常有用。

将输出管道输入日志文件可能是一个好主意,这样你就可以看到你的脚本是否也抛出任何错误 - 因为你不会在你的终端中看到它们。

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

#!/usr/bin/php

这样你可以像这样调用整个事情

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

答案 2 :(得分:4)

你正在设置你的cron每小时在第10分钟运行 要将其设置为every 5 mins,请更改为*/5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1

答案 3 :(得分:2)

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

  1. 使用执行cronjob的用户登录服务器
  2. 手动运行php命令:

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

  3. 并检查是否显示任何错误

答案 4 :(得分:2)

# .---------------- 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

答案 5 :(得分:0)

如果您想每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/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在“ 2015-10-21 07:28:00”之后的每42分钟运行一次,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没有亚秒精度