【发布时间】:2026-01-04 06:00:01
【问题描述】:
我想要一个可以将任意通用脚本或命令转换为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:如果有用的话,here's 一个类似的特定于 python 的问题。
this 对类似问题的回答似乎是一个有用的成语,可以快速而肮脏地妖魔化任意脚本:
【问题讨论】:
-
纯shell版本见serverfault.com/questions/311593/…
标签: perl unix scripting sysadmin daemon