我想要一个可以将任意通用脚本或命令转换为daemon的守护程序。
我想处理两种常见的情况:
我有一个应该永远运行的脚本。如果它死了(或在重新启动时),请重新启动它。不要让两个副本同时运行(检测一个副本是否已经在运行,在这种情况下不要启动它)。
我有一个简单的脚本或命令行命令,我想永远重复执行(运行之间有短暂的停顿)。同样,不要让脚本的两个副本同时运行。
当然,在案例 2 中围绕脚本编写一个“while(true)”循环然后为案例 1 应用解决方案是微不足道的,但更通用的解决方案将直接解决案例 2,因为这适用于案例 1 中的脚本好吧(如果脚本不打算死掉,你可能只需要更短的暂停或没有暂停(当然,如果脚本真的永远不会死,那么暂停实际上并不重要))。
请注意,该解决方案不应涉及,例如,将文件锁定代码或 PID 记录添加到现有脚本。
更具体地说,我想要一个可以运行的程序“守护进程”
% daemonize myscript arg1 arg2
或者,例如,
% daemonize 'echo `date` >> /tmp/times.txt'
这将使越来越多的日期列表附加到 times.txt。(请注意,如果 daemonize 的参数是一个像上面的情况 1 一样永远运行的脚本,那么 daemonize 仍然会做正确的事情,在必要时重新启动它。)然后我可以在我的 .login 中放置一个类似上面的命令和/或每小时或每分钟 cron 它(取决于我对它意外死亡的担心程度)。
注意: daemonize 脚本需要记住它正在守护的命令字符串,这样如果相同的命令字符串再次被守护,它就不会启动第二个副本。
此外,理想情况下,该解决方案应该适用于 OS X 和 linux,但欢迎使用其中一种或另一种的解决方案。
编辑:如果您必须使用sudo daemonize myscript myargs
.
(如果我认为这一切都错了,或者有快速而肮脏的部分解决方案,我也很想听听。)
PS:如果它有用,这里有一个类似的问题特定于 python。
这个对类似问题的回答似乎是一个有用的习语,可以快速而肮脏地妖魔化任意脚本: