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

bqujaahr  于 2023-01-16  发布在  PHP
关注(0)|答案(7)|浏览(125)

我正在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分钟内与此配置。

fdx2calv

fdx2calv1#

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守护进程有问题。

1wnzp6jl

1wnzp6jl2#

您的CRON应如下所示:
*/5 * * * *
当您需要测试您的CRON设置时,CronWTF非常有用。
将输出通过管道传输到日志文件中可能是一个好主意,这样您就可以看到脚本是否也抛出了任何错误-因为您不会在终端中看到它们。
也可以尝试在PHP文件的顶部使用一个shebang,这样系统就知道在哪里可以找到PHP。
#!/usr/bin/php
这样你就可以把整件事说成这样
*/5 * * * * php /path/to/script.php > /path/to/logfile.log

c3frrgcw

c3frrgcw3#

如果您希望每隔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之后的总秒数。设'假设我们希望在Marty McFly到达里弗代尔时第一次开始运行该命令,然后每隔n分钟重复一次。

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

对于在'2015-10-21 07:28:00'之后每隔42 nd分钟运行一次的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无亚秒级精度

bjg7j2ky

bjg7j2ky4#

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

tv6aics1

tv6aics15#

检查cronjob是否正常工作的2个步骤:
1.以执行cronjob的用户身份登录服务器
1.手动运行php命令:
/usr/中文/php /mydomain.in/cromail.php
并检查是否显示任何错误

gzjq41n4

gzjq41n46#

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

e4eetjau7#

  • /5 * * * * php /用户名/bin/php/mydomain.in/cromail.php

相关问题