如何运行一个错误的工作每 X 分钟?

我在运行一个错误的 PHP 脚本,我想发送电子邮件每5分钟

我现在的错误工作:

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

The cronmail.php is as follows:

<?php
$from = 'D'; // sender
$subject = 'S';
$message = 'M';
$message = wordwrap($message, 70);
mail("myemail@gmail.com", $subject, $message, "From: $from\n");
?>

但是我已经30分钟没有收到这种配置的电子邮件了。

203734 次浏览

检查错误工作是否有效的两个步骤:

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

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

并检查是否显示任何错误

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

crontab文件中,字段如下:

  • 一分钟。
  • 一天中的一小时。
  • 每月的一天。
  • 每年的月份。
  • 星期几。

所以:

10 * * * * blah

意味着每小时过10分钟执行 blah

If you want every five minutes, use either:

*/5 * * * * blah

意思是每一分钟,但只有五分之一,或:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * blah

对于不理解 */x表示法的旧的 cron可执行文件。

如果此后 还是似乎无法工作,请将命令更改为以下内容:

date >>/tmp/debug_cron_pax.txt

监控那个文件,确保每五分钟写一次。如果是这样,那么您的 PHP 脚本就有问题。如果没有,那么您的 cron守护进程就有问题。

您的 CRON 应该是这样的:

*/5 * * * *

CronWTF is really usefull when you need to test out your CRON settings.

最好将输出通过管道传输到一个日志文件中,这样您就可以看到您的脚本是否也抛出了任何错误——因为您在终端中不会看到这些错误。

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

#!/usr/bin/php

这样你就可以把整件事称之为

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

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

如果希望每隔 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表示值 nm表示小于 n*的值。这将在 m,m+n,m+2n,...分钟时执行该命令

n不能除以60

如果 n没有除以60,你不能用 cron 干净利落地做到这一点,但这是可能的。要做到这一点,您需要在 cron 中放置一个测试,测试将在其中检查时间。这最好在查看 UNIX 时间戳(从 1970-01-01 00:00:00 UTC开始的总秒数)时完成。假设我们想在马蒂 · 麦克弗莱到达里弗代尔的第一时间运行这个命令,然后每隔几分钟重复一次。

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

要让 cronjob 在“2015-10-2107: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 时间不受闰秒的影响

Remark: cron has no sub-second accuracy