保持 init.d 启动的进程的标准或最佳方法

保持 init.d 启动的进程的标准或最佳方法

我正在寻找一种标准方法或最佳实践来保持由init.dshell 脚本启动的守护进程处于活动状态。

或者甚至更好的是,有没有办法让它直接从中保持活力/etc/init.d

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

我想在启动时运行此 dtnd 守护程序。为了实现此行为,我创建了一个 init.d 脚本,该脚本使用 start、stop 和 status 命令“包装”dtnd 文件。

我有两个问题需要解决:

  1. 有没有办法实现保持 init.d 中的某些进程处于活动状态shell 脚本。是标准/最佳做法吗?

  2. 建议使用无限循环来保持进程处于活动状态?我猜最好使用类似的命令respawn来实现这一点。对吗?

我知道该命令的存在respawn。我想这就是我需要的,但我不明白/etc/init.d/和之间的工作流程/etc/init。有人能帮我吗?

请注意,我没有 inittab 也没有 upstart (我只能使用/etc/init/etc/init.dcron系统工具作为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/inittabrespawn

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 的东西并试图确保它正在运行,或者你是否需要一些东西来监视你创建的守护进程。

相关内容