我正在寻找一个标准的方法或最佳实践来保持一个由init.d shell脚本启动的守护进程。
或者甚至更好,有没有办法让它直接从/etc/init.d ?
具体来说,我有一个名为dtnd的守护进程,并且有无限循环,用于查找意外的结束进程,如果有的话,守护进程会再次唤醒它们。 另外,我使用start-stop-daemon工具来让给定的系统用户运行进程。
我想从启动运行这个dtnd守护进程。 为了实现这个行为,我创build了一个init.d脚本,它使用start,stop和status命令来“包装”dtnd文件。
我有两个问题,我想解决:
有没有办法实现从init.d shell脚本保持活着的一些进程 。 是一种标准/最好的方式吗?
build议使进程保持无限循环状态? 我想最好使用一些像respawn这样的命令来实现。 这是正确的?
我知道respawn命令的存在。 我想这就是我所需要的,但是我不了解/etc/init.d/和/etc/init之间的工作stream程。 任何人都可以帮我吗?
注意,我没有inittab,也没有upstart(我只允许使用/etc/init , /etc/init /etc/init.d , cron和系统工具作为start-stop-daemon 。我的意思是,只有默认的工具)
非常感谢你的时间!
Debian最终会拥有systemd,所以这是在使用systemd的Linux系统上完成的方法(许多已经做过;您可能会考虑切换分发版)。
Systemd可以自动处理让服务保持活着状态; 没有其他工具是必需的。 只要确保在服务文件的[Service]部分中设置了Restart=always 。
# vi /etc/systemd/system/dtnd.service [Service] Restart=always #...everything else...
其他几个选项也可用于更复杂的场景。
你可以用respawn把它添加到/etc/inittab :
d1:2345:respawn:/path/to/your/first_daemon arg1 arg2 d2:2345:respawn:/path/to/your/second_daemon arg1 arg2
这是一个肮脏的黑客攻击,但我以前在较老的sysv-init系统上成功地使用了它。
最好的做法是确保守护进程不首先停止。
如果你不想看看DJB的守护神工具,
那么这就是为什么debian正在转向systemd的主要原因之一。
sysvinit(/etc/init.d)无法检测,如果服务停机/没有响应。 这意味着你必须监视这些服务,并升级,如果服务不再做他的工作了。
可能最简单的做法是迁移到另一个daemonhandler,比如systemd(在RHEL7中默认,在下一个debian和Ubuntu lts中默认),upstart(默认在RHEL6,Ubuntu 12.04和14.04),daemontools(像上面提到的,develloped由djb)或其他东西。
保持服务活着的工作将是sysvinit中的PITA。
对我来说,标准的方法是使用Monit实用程序 。
如果你写了类似Monit的东西,并试图确保它正在运行,或者你需要一些东西来观察你创build的守护进程,我不能从你的描述中知道。