我正在寻找一种标准方法或最佳实践来保持由init.d
shell 脚本启动的守护进程处于活动状态。
或者甚至更好的是,有没有办法让它直接从中保持活力/etc/init.d
?
具体来说,我有一个名为 dtnd 的守护进程,它有一个无限循环,用于查找意外结束的进程,如果有,守护进程会再次唤醒它们。此外,我使用 start-stop-daemon 工具让进程以给定系统用户的身份运行。
我想在启动时运行此 dtnd 守护程序。为了实现此行为,我创建了一个 init.d 脚本,该脚本使用 start、stop 和 status 命令“包装”dtnd 文件。
我有两个问题需要解决:
有没有办法实现保持 init.d 中的某些进程处于活动状态shell 脚本。是标准/最佳做法吗?
建议使用无限循环来保持进程处于活动状态?我猜最好使用类似的命令
respawn
来实现这一点。对吗?
我知道该命令的存在respawn
。我想这就是我需要的,但我不明白/etc/init.d/
和之间的工作流程/etc/init
。有人能帮我吗?
请注意,我没有 inittab 也没有 upstart (我只能使用/etc/init
、/etc/init.d
和cron
系统工具作为start-stop-daemon
。我的意思是,只有默认工具)
非常感谢您的参与!
答案1
Debian 最终将拥有 systemd,因此这是在使用 systemd 的 Linux 系统上执行此操作的方法(许多系统已经这样做了;您可以考虑切换发行版)。
Systemd 可以自动为您处理服务保持活动状态;无需其他工具。只需确保Restart=always
在服务文件的[Service]
部分中设置即可。
# vi /etc/systemd/system/dtnd.service
[Service]
Restart=always
#...everything else...
其他几种选择也可用于更复杂的场景。
答案2
您可以将其添加/etc/inittab
到respawn
:
d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2
这是一个肮脏的黑客行为,但我过去曾在较旧的 sysv-init 系统上成功使用过它。
答案3
嗯,这就是 Debian 转向 systemd 的主要原因之一。
sysvinit (/etc/init.d) 无法检测服务是否关闭/无响应。这意味着您必须监控这些服务,如果服务不再执行其工作,则必须升级。
可能最简单的事情就是迁移到另一个守护进程处理程序,如 systemd(RHEL7 中的默认设置,将成为下一个 debian 和 ubuntu lts 中的默认设置)、upstart(RHEL6、Ubuntu 12.04 和 14.04 中的默认设置)、daemontools(如上所述,由 djb 开发)或其他东西。
在 sysvinit 中,保持服务正常运行将是 PITA。
答案4
对我来说,标准方法是使用监视实用程序为了这。
我无法从你的描述中判断你是否编写了类似 Monit 的东西并试图确保它正在运行,或者你是否需要一些东西来监视你创建的守护进程。