Linux:每天在特定的、不同的预定时间安排命令

Linux: schedule command at a specific, different predetermined time every day

我必须每天在不同的时间运行执行命令。时间是预先知道的,并以熟悉的 YYYY-MM-DD HH:MM:SS 格式保存在 MySQL 数据库中。

我想到的:

  1. cron 在第一天的确切时间安排作业,然后让脚本本身用第二天的正确时间修改 crontab 条目。

  2. cron 大约 的正确时间安排作业,然后使其读取 准确的 从数据库中获取时间并在此之前休眠。

  3. cron每分钟调度一次job执行,交给脚本判断当前date/time是否对应正确的执行时间;是则继续,否则退出

  4. at 第一天用 at 提交作业,然后让它从数据库中读取第二天的时间,然后用 at 重新提交自己.

附加信息:

该命令是一个 PHP 脚本,用于编写当天的消息并将其发送给在网站上注册的所有用户。如果其他技术能更好地解决这个问题,我可以考虑。我想保留重启服务器的能力(在预期的执行时间之外),而不用太担心作业丢失,因此解决方案 1.3. 在这方面看起来更好。我开始使用两个命令 运行 在一天的两个不同时间,但我很快就会在每天不同的时间安排更多类似的工作,所以我宁愿避免混乱越多越好。此时我可能会选择 3 选项。

问题: 是否有更好/首选/既定的方法来完成此任务?欢迎使用上述以外的解决方案。我应该注意哪些(您推荐的解决方案)的主要缺点?

我相信您需要构建自定义应用程序来实现您想要实现的逻辑。

最终您可以使用 cron 系统启动进程或确保进程正在 运行ning(以防它死掉或被杀死)。

在你的位置,我会做的是编写一个自定义 PHP 程序(或 python 或你命名的程序)来执行以下操作:

  • 打开与数据库的连接
  • 检查下一次执行的时间
  • 计算是否到了 运行
  • 如果没有,它会休眠 X 秒(这取决于您的偏好)
  • 是时候了运行,它履行职责
  • 再次入睡,循环开始

另一种方法是检查每次执行计划,以检查计划中的更改。

另一个会被读取一次并休眠直到执行时间,但在另一种情况下你不会捕捉到调度中的变化

这就看你了,总之这个程序非常简单

我最终使用了上面的解决方案 3.,到目前为止我对此非常满意。

所有逻辑都在.php文件中,该文件负责:

  1. 将当前 date/time 保存在一个变量中(例如 $now
  2. 对其进行任何考虑
  3. 扫描数据库以搜索匹配项 date/time

这实际上允许合理程度的灵活性:

  1. 如果某个信号量文件存在,我可以选择不运行任何命令:

    if (file_exists($filename)) {exit;}
    
  2. 我可以在选项文件中设置参数,例如调试或测试模式:

    include parameters.php
    if ($debug === true) {error_reporting(E_ALL);}
    
  3. 我可以避免打扰用户,比方说,元旦:

    if (date('m-d') == '01-01') {exit;}
    
  4. 我可以根据自定义逻辑引入延迟:

    if (date('w', strtotime($now)) === '0') {$now = date('Y-m-d H:i:s', strtotime($now . ' +15 minutes'));}