PHP,crontab,DateInterval:将可读时间间隔转换为crontab格式

3

我对crontab的间隔格式有点困惑。我的意思是,我想从可读字符串(如“20分钟”,“16小时30分钟”)中获取间隔时间。这可以通过PHP DateTime已经实现。但我需要传递一个符合crontab规范的字符串作为exec(sprintf('echo "%s %s %s * * %s" | crontab', $minute, $hour, $day, $command));。无论如何,以下是示例PHP脚本:

<?php
function getCrontabInterval($timestring)
{
    $interval = DateInterval::createFromDateString($timestring);

    $minute = $interval->i > 0 ? "*/{$interval->i}" : '*';
    $hour = $interval->h > 0 ? "*/{$interval->h}" : '*';
    $day = $interval->d > 0 ? "*/{$interval->d}" : '*';
    $crontab = sprintf('echo "%s %s %s * * %s" | crontab', $minute, $hour, $day, '%command%');

    echo "Days:\t\t", $interval->d, "\n",
        "Hours:\t\t", $interval->h, "\n",
        "Minutes:\t", $interval->i, "\n",
        "COMMAND:\t", $crontab, "\n";
}


 getCrontabInterval($_SERVER['argv'][1]);

输出结果:

serge@serge-laptop:~/www/bin$ php periodical.php '2 hours 25 minutes'
Days:       0
Hours:      2
Minutes:    25
COMMAND:    echo "*/25 */2 * * * %command%" | crontab

那么,“*/25 */2 * * *” cron值会匹配每2小时25分钟运行一次的命令吗?还是应该类似于“0/25 0/2 * * *”这样的形式?从 manpages 中无法清楚地了解。那么对于日期,该怎么处理呢?
更新:在“每2小时25分钟”下,我指的是在0:00、2:25、4:50、7:15等时间运行。
解决方案:使用两个组件值的间隔,并建议手动使用20分钟、3小时、4天等值。

你是想每2小时25分钟运行一次吗?还是每2小时后的25分钟运行一次? - John Giotta
我的意思是0:00,2:25,4:50,7:15等等。 - nefo_x
2个回答

2

*/25 */2 * * * 的意思是在0:00、0:25、0:50、2:00、2:25、2:50、4:00、4:25、4:50等时间执行...

25 */2 * * * 的意思是在0:25、2:25、4:25、6:25等时间执行...

0/25 0/2 * * * 的意思是只在0:25执行

编辑 - 在您的更新之后

据我所知,在crontab中没有一行代码可以实现这种复杂度。指定cron作业运行的时间机制并不适用于这种类型的复杂性。但是,如果您确实需要2h25分钟的功能,则可以在crontab中有9或10个条目,并在不同的时间运行相同的脚本。


我会修改这个选项。我想把所有的时间都转换成 "25 分钟" -> "*/25 * * * * ","2 小时" -> " */2 * * *"(或者是 0 */2 * * ?...),"3 天" -> " * */3 * *"。 - nefo_x

1

字符串 "*/25 */2 * * *" 每隔 2 小时的每个 25 分钟运行一次命令
字符串 "25 */2 * * *" 每隔 2 小时 25 分钟运行一次命令


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接