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

时间:2017-04-04 09:54:44

标签: mysql linux job-scheduling ubuntu-server

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

我的想法:

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

  2. cron大约的时间安排作业,然后让它从数据库中读取完全时间并一直睡到那时。< / p>

  3. cron每分钟安排作业执行,并将其留给脚本以确定当前日期/时间是否对应于正确的执行时间;如果是,则退出,否则退出。

  4. at使用at在第一天提交作业,然后在第二天从数据库中读取该作业,然后使用at重新提交。{/ p >

  5. 其他信息:

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

    问题: 是否有更好/首选/已建立的方式来完成此任务?其他上述解决方案是值得欢迎的。我应该注意哪些主要缺点(推荐的解决方案)?

2 个答案:

答案 0 :(得分:0)

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

最终,您可以使用cron系统启动进程或确保进程正在运行(如果它已经死亡或被杀死)。

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

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

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

另一个人将被阅读一次并一直睡到执行时间,但在另一个案例中你不会记录时间表的变化

这一切都取决于你,所有程序都非常简单

答案 1 :(得分:0)

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

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

  1. 将当前日期/时间保存在变量中(例如$now
  2. 对其进行任何考虑
  3. 扫描数据库以搜索匹配的日期/时间
  4. 这实际上允许合理程度的灵活性:

    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'));}