Linux:每天在特定的、不同的预定时间安排命令
Linux: schedule command at a specific, different predetermined time every day
我必须每天在不同的时间运行执行命令。时间是预先知道的,并以熟悉的 YYYY-MM-DD HH:MM:SS
格式保存在 MySQL 数据库中。
我想到的:
cron
在第一天的确切时间安排作业,然后让脚本本身用第二天的正确时间修改 crontab
条目。
cron
在 大约 的正确时间安排作业,然后使其读取 准确的 从数据库中获取时间并在此之前休眠。
cron
每分钟调度一次job执行,交给脚本判断当前date/time是否对应正确的执行时间;是则继续,否则退出
at
第一天用 at
提交作业,然后让它从数据库中读取第二天的时间,然后用 at
重新提交自己.
附加信息:
该命令是一个 PHP 脚本,用于编写当天的消息并将其发送给在网站上注册的所有用户。如果其他技术能更好地解决这个问题,我可以考虑。我想保留重启服务器的能力(在预期的执行时间之外),而不用太担心作业丢失,因此解决方案 1.
和 3.
在这方面看起来更好。我开始使用两个命令 运行 在一天的两个不同时间,但我很快就会在每天不同的时间安排更多类似的工作,所以我宁愿避免混乱越多越好。此时我可能会选择 3
选项。
问题:
是否有更好/首选/既定的方法来完成此任务?欢迎使用上述以外的解决方案。我应该注意哪些(您推荐的解决方案)的主要缺点?
我相信您需要构建自定义应用程序来实现您想要实现的逻辑。
最终您可以使用 cron 系统启动进程或确保进程正在 运行ning(以防它死掉或被杀死)。
在你的位置,我会做的是编写一个自定义 PHP 程序(或 python 或你命名的程序)来执行以下操作:
- 打开与数据库的连接
- 检查下一次执行的时间
- 计算是否到了 运行
- 如果没有,它会休眠 X 秒(这取决于您的偏好)
- 是时候了运行,它履行职责
- 再次入睡,循环开始
另一种方法是检查每次执行计划,以检查计划中的更改。
另一个会被读取一次并休眠直到执行时间,但在另一种情况下你不会捕捉到调度中的变化
这就看你了,总之这个程序非常简单
我最终使用了上面的解决方案 3.
,到目前为止我对此非常满意。
所有逻辑都在.php
文件中,该文件负责:
- 将当前 date/time 保存在一个变量中(例如
$now
)
- 对其进行任何考虑
- 扫描数据库以搜索匹配项 date/time
这实际上允许合理程度的灵活性:
如果某个信号量文件存在,我可以选择不运行任何命令:
if (file_exists($filename)) {exit;}
我可以在选项文件中设置参数,例如调试或测试模式:
include parameters.php
if ($debug === true) {error_reporting(E_ALL);}
我可以避免打扰用户,比方说,元旦:
if (date('m-d') == '01-01') {exit;}
我可以根据自定义逻辑引入延迟:
if (date('w', strtotime($now)) === '0') {$now = date('Y-m-d H:i:s', strtotime($now . ' +15 minutes'));}
我必须每天在不同的时间运行执行命令。时间是预先知道的,并以熟悉的 YYYY-MM-DD HH:MM:SS
格式保存在 MySQL 数据库中。
我想到的:
cron
在第一天的确切时间安排作业,然后让脚本本身用第二天的正确时间修改crontab
条目。cron
在 大约 的正确时间安排作业,然后使其读取 准确的 从数据库中获取时间并在此之前休眠。cron
每分钟调度一次job执行,交给脚本判断当前date/time是否对应正确的执行时间;是则继续,否则退出at
第一天用at
提交作业,然后让它从数据库中读取第二天的时间,然后用at
重新提交自己.
附加信息:
该命令是一个 PHP 脚本,用于编写当天的消息并将其发送给在网站上注册的所有用户。如果其他技术能更好地解决这个问题,我可以考虑。我想保留重启服务器的能力(在预期的执行时间之外),而不用太担心作业丢失,因此解决方案 1.
和 3.
在这方面看起来更好。我开始使用两个命令 运行 在一天的两个不同时间,但我很快就会在每天不同的时间安排更多类似的工作,所以我宁愿避免混乱越多越好。此时我可能会选择 3
选项。
问题: 是否有更好/首选/既定的方法来完成此任务?欢迎使用上述以外的解决方案。我应该注意哪些(您推荐的解决方案)的主要缺点?
我相信您需要构建自定义应用程序来实现您想要实现的逻辑。
最终您可以使用 cron 系统启动进程或确保进程正在 运行ning(以防它死掉或被杀死)。
在你的位置,我会做的是编写一个自定义 PHP 程序(或 python 或你命名的程序)来执行以下操作:
- 打开与数据库的连接
- 检查下一次执行的时间
- 计算是否到了 运行
- 如果没有,它会休眠 X 秒(这取决于您的偏好)
- 是时候了运行,它履行职责
- 再次入睡,循环开始
另一种方法是检查每次执行计划,以检查计划中的更改。
另一个会被读取一次并休眠直到执行时间,但在另一种情况下你不会捕捉到调度中的变化
这就看你了,总之这个程序非常简单
我最终使用了上面的解决方案 3.
,到目前为止我对此非常满意。
所有逻辑都在.php
文件中,该文件负责:
- 将当前 date/time 保存在一个变量中(例如
$now
) - 对其进行任何考虑
- 扫描数据库以搜索匹配项 date/time
这实际上允许合理程度的灵活性:
如果某个信号量文件存在,我可以选择不运行任何命令:
if (file_exists($filename)) {exit;}
我可以在选项文件中设置参数,例如调试或测试模式:
include parameters.php if ($debug === true) {error_reporting(E_ALL);}
我可以避免打扰用户,比方说,元旦:
if (date('m-d') == '01-01') {exit;}
我可以根据自定义逻辑引入延迟:
if (date('w', strtotime($now)) === '0') {$now = date('Y-m-d H:i:s', strtotime($now . ' +15 minutes'));}