我需要一个能将任意通用脚本或命令转化为守护进程的程序。
有两种常见情况需要处理:
我有一个应该一直运行的脚本。如果它停止(或者重启),应该重新启动它。不要让其同时运行两个副本(如果已经有一个副本在运行,则检测并不启动)。
我有一个简单的脚本或命令行命令,我想一直执行下去(每次执行之间有短暂的暂停)。同样,不允许同时运行两个副本。
当然,在第二种情况下,将脚本放入"while(true)"循环中很容易,并应用第一种情况的解决方案,但是更通用的解决方案将直接解决第2种情况,因为这也适用于第1种情况中的脚本(如果脚本永远不会死亡,则您可能只希望短暂暂停或不暂停(当然,如果脚本确实永远不死亡,则暂停实际上并不重要))。
请注意,解决方案不应涉及向现有脚本添加文件锁定代码或PID记录。
更具体地说,我希望有一个名为"daemonize"的程序,可以像这样运行:
% daemonize myscript arg1 arg2
或者,例如,
% daemonize 'echo `date` >> /tmp/times.txt'
这将使一个不断增长的日期列表添加到times.txt中。(请注意,如果daemonize的参数是一个像case 1一样永远运行的脚本,那么daemonize仍然会做正确的事情,在必要时重新启动它。) 然后我可以在我的.login中放置一个如上的命令,并每小时或每分钟执行它(具体取决于我对其意外死机的担忧程度)。
NB:daemonize脚本需要记住它正在守护进程的命令字符串,以便如果再次守护相同的命令字符串,它不会启动第二个副本。
此外,解决方案理想情况下应该适用于OS X和Linux,但欢迎针对其中之一的解决方案。
编辑:如果您必须使用sudo daemonize myscript myargs
来调用它,也没问题。
(如果我对此的思考方式有误,或者有快速而肮脏的部分解决方案,我也很乐意听听。)
PS:如果有用的话,这里 有一个关于Python的类似问题。
这个回答给出了一种快速而简单的方法来使任意脚本成为守护进程的惯用语,看起来非常有用: