我在 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 分钟内没有收到使用此配置的电子邮件。
cromail.php
还是 cronmail.php
?
在 crontab
文件中,字段为:
小时的分钟。
一天中的一个小时。
一个月的一天。
一年中的一个月。
一周中的天。
所以:
10 * * * * blah
表示在每小时过去 10 分钟执行 blah
。
如果您希望每五分钟一次,请使用:
*/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 * * * *
当您需要测试 CRON 设置时,CronWTF 非常有用。
将输出通过管道传输到日志文件中可能是个好主意,这样您就可以查看脚本是否也抛出任何错误 - 因为您不会在终端中看到它们。
还可以尝试在 PHP 文件的顶部使用 shebang,以便系统知道在哪里可以找到 PHP。如:
#!/usr/bin/php
这样你就可以这样称呼整个事情
*/5 * * * * php /path/to/script.php > /path/to/logfile.log
CronWTF
似乎永久关闭。试图编辑原件,但不能。
如果您想每 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
对于在“2015-10-21 07:28:00”之后每 42
分钟运行一次的 cronjob,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
在 syslog 中给出 Error: bad minute; while reading /etc/crontab
(在 Ubuntu 中使用 cron v. 3.0pl1-128ubuntu2)。这种 m/n 符号是否已被放弃,还是仅在某些系统中可用?
m-59/n
。只有一个范围可以有一个步长。 (见 man 5 crontab
)。我已经更新了答案
您将 cron 设置为每小时第 10 分钟运行。
要将其设置为 every 5 mins
,请更改为 */5 * * * * /usr/bin/php /mydomain.in/cronmail.php > /dev/null 2>&1
usr/bin/php
部分
*/5 * * * * /usr/bin/php /mydomain.in/cromail.php > /dev/null 2>&1
检查 cronjob 是否正常工作的 2 个步骤:
使用执行 cronjob 的用户登录服务器手动运行 php 命令:/usr/bin/php /mydomain.in/cromail.php
并检查是否显示任何错误
# .---------------- 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