PHP、crontab、DateInterval:将人类可读的间隔转换为 crontab 格式

发布于 2024-10-18 14:32:06 字数 1419 浏览 2 评论 0原文

我对 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 * * *”之类的东西?从联机帮助页中我不清楚。又该如何应对日子呢?

UPD:在每个“2 小时 25 分钟”下,我的意思是在 0:00、2:25、4:50、7:15 等运行

解决方案: 使用两部分值作为间隔,并有一些手动建议使用 20 分钟、3 小时、4 天等值。

I'm having a little confusion with crontab interval format. The point is that i want to get intervals from human-readable strings like "20 minutes", "16 hours and 30 minutes". This is done by PHP DateTime already. But what I need is passing crontab-valid string as exec(sprintf('echo "%s %s %s * * %s" | crontab', $minute, $hour, $day, $command));. Anyhow, here is sample PHP script

<?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]);

And its output:

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

So, will the "*/25 */2 * * *" cron value match running command EACH 2 hours 25 minutes? Or it should be something like "0/25 0/2 * * *"? It was not clear for me from manpages. And how to act with days?

UPD: Under each "2 hours 25 minutes" i mean running at 0:00, 2:25, 4:50, 7:15 and etc

SOLUTION:
used two-component value for intervals with some manual recommendation to use values like 20 minutes, 3 hours, 4 days and etc.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

拿命拼未来 2024-10-25 14:32:06

*/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 */2 * * * means at 0:00, 0:25, 0:50, 2:00, 2:25, 2:50, 4:00, 4:25, 4:50 etc...

25 */2 * * * means 0:25, 2:25, 4:25, 6:25, etc...

0/25 0/2 * * * means 0:25 only

EDIT - After your update

To my knowledge there is no way to do it with a single line in a crontab. The mechanism for specifying at what time your cron job runs is not meant for this kind of complexity.
You can however have 9 or 10 entries in your crontab with different times to the same script if you really need that 2h25 functionality

违心° 2024-10-25 14:32:06

字符串“*/25 */2 * * *”将每 2 小时每 25 分钟运行一次命令
字符串“25 */2 * * *”将每 2 小时 25 分钟运行一次命令

String "*/25 */2 * * *" will runs command each 2 hours EACH 25 minutes
String "25 */2 * * *" will runs command each 2 hours 25 minutes

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文