所以我试图 Build 一个cron作业作为我创建的守护进程的监视器 . 如果守护进程出错并失败,我希望cron作业定期重启...我不确定这是多么可能,但我通读了几个cron教程,找不到任何可以做到的东西我我正在寻找......
我的守护进程是从shell脚本启动的,所以我真的只是在寻找一种方法来运行一个cron作业,如果该作业的上一次运行还没有运行的话 .
I found this post,确实提供了一个解决方案,我不确定是否有更好的方法来做到这一点......
谢谢你的帮助 .
所以我试图 Build 一个cron作业作为我创建的守护进程的监视器 . 如果守护进程出错并失败,我希望cron作业定期重启...我不确定这是多么可能,但我通读了几个cron教程,找不到任何可以做到的东西我我正在寻找......
我的守护进程是从shell脚本启动的,所以我真的只是在寻找一种方法来运行一个cron作业,如果该作业的上一次运行还没有运行的话 .
I found this post,确实提供了一个解决方案,我不确定是否有更好的方法来做到这一点......
谢谢你的帮助 .
15 回答
令人惊讶的是没有人提到run-one . 我用这个解决了我的问题 .
然后在crontab脚本之前添加
run-one
查看this askubuntu SE回答 . 您也可以在那里找到详细信息的链接 .
您也可以直接在crontab中以单行方式执行此操作:
作为Earlz回答的后续内容,您需要一个包装器脚本,它在启动时创建$ PID.running文件,并在结束时删除 . 包装器脚本调用您希望运行的脚本 . 如果目标脚本失败或错误输出,则必须使用包装器,pid文件将被删除 .
正如其他人所说,编写和检查PID文件是一个很好的解决方案 . 这是我的bash实现:
不要试图通过cron来做 . 让cron运行一个脚本,无论如何,然后让脚本决定程序是否正在运行并在必要时启动它(请注意,您可以使用Ruby或Python或您喜欢的脚本语言来执行此操作)
我为我编写的打印后台程序程序执行此操作,它只是一个shell脚本:
它每两分钟运行一次,非常有效 . 如果由于某种原因进程没有运行,我会通过电子邮件向我发送特殊信息 .
使用
flock
. 它好了.2688902_更好 .现在您不必自己编写代码 . 查看更多原因:https://serverfault.com/a/82863
我在运行php脚本时的方式是:
crontab:
php代码:
此命令在系统进程列表中搜索当前php文件名(如果存在)行计数器(wc -l)将大于1,因为搜索命令本身包含文件名
因此,如果你运行php crons将上面的代码添加到你的PHP代码的开头,它将只运行一次 .
我建议使用现有的工具,如monit,它将监视和自动重启进程 . 有更多可用信息here . 它应该在大多数发行版中都很容易获得 .
使用
lockrun
,您无需为cron作业编写包装脚本 . http://www.unixwiz.net/tools/lockrun.htmlThis one从未失败过我:
one.sh :
cron job :
我建议以下作为rsanden's answer的改进(我有足够的声誉......):
这可以避免可能的错误匹配(以及grepping的开销),并且它会抑制输出并仅依赖于ps的退出状态 .
简单的自定义php足以实现 . 无需与shell脚本混淆 .
假设你想运行 php /home/mypath/example.php 如果没有运行
然后使用以下自定义php脚本执行相同的工作 .
创建以下 /home/mypath/forever.php
然后在你的cron中添加以下内容
如果你要去那条路线,考虑使用pgrep(如果可用)而不是通过grep传输 . 虽然,就个人而言,我已经从表格的脚本中获得了很多
虽然这可能会失败,而cron工作通常是必不可少的工作的最佳方式 . 只是另一种选择 .