标准或最好的方式来保持活动进程由init.d启动

我正在寻找一个标准的方法或最佳实践来保持一个由init.d shell脚本启动守护进程

或者甚至更好,有没有办法让它直接从/etc/init.d

具体来说,我有一个名为dtnd的守护进程,并且有无限循环,用于查找意外的结束进程,如果有的话,守护进程会再次唤醒它们。 另外,我使用start-stop-daemon工具来让给定的系统用户运行进程。

我想从启动运行这个dtnd守护进程。 为了实现这个行为,我创build了一个init.d脚本,它使用start,stop和status命令来“包装”dtnd文件。

我有两个问题,我想解决:

  1. 有没有办法实现从init.d shell脚本保持活着的一些进程 。 是一种标准/最好的方式吗?

  2. build议使进程保持无限循环状态? 我想最好使用一些像respawn这样的命令来实现。 这是正确的?

我知道respawn命令的存在。 我想这就是我所需要的,但是我不了解/etc/init.d//etc/init之间的工作stream程。 任何人都可以帮我吗?

注意,我没有inittab,也没有upstart(我只允许使用/etc/init/etc/init /etc/init.dcron和系统工具作为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的守护进程,我不能从你的描述中知道。