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


14

我正在寻找一种标准方法或最佳实践,以使由init.dShell脚本启动的守护程序保持活动状态。

甚至更好的是,有没有办法让它直接存活/etc/init.d

具体来说,我有一个名为dtnd的守护进程,它带有无限循环,该循环查找意外终止的进程,如果有的话,该守护进程将再次唤醒它们。另外,我使用start-stop-daemon工具,以便从给定的系统用户运行进程。

我想从启动运行此dtnd守护程序。为了实现此行为,我创建了一个init.d脚本,该脚本使用启动,停止和状态命令来“包装” dtnd文件。

我有两个问题要解决:

  1. 有没有一种方法可以使init.d shell脚本中的某些进程保持活动状态。是否有标准/最佳做法?

  2. 建议通过无限循环使进程保持活动状态吗?我想最好使用一些命令respawn来达到目的。这是正确的?

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

请注意,我没有inittab文件既没有暴发户(我只被允许使用/etc/init/etc/init.dcron和系统工具start-stop-daemon。我的意思是,只有默认工具)

非常感谢您的参与!


Answers:


13

Debian最终将拥有systemd,因此这是在使用systemd的Linux系统上进行此操作的方法(许多已经这样做;您可能会考虑切换发行版)。

Systemd可以自动为您处理保持服务状态;不需要其他工具。只需确保Restart=always在服务文件的[Service]部分中进行了设置即可。

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

对于更复杂的场景,还可以使用其他几个选项


2
尽管未来显示出更多的灵活选择,但这是否照顾到了当前的环境/条件?与叉车分布变更/升级相比,安装工具似乎是阻力最小的途径。
ewwhite 2014年

@ewwhite取决于。Debian自从狂风起就开始系统化了,但这不是默认的init。它应该是jessie的默认值。并且由于我们的用户接受了答案,因此我认为他已经出于其他原因使用了systemd(或已获得安装许可)。
迈克尔·汉普顿

systemd似乎放弃了init.d脚本并基于*.service
yurenchen

2
而不是直接使用safer进行编辑systemctl edit myservice,然后systemctl daemon-reload重新启动myservice。
Pablo A

@PabloBianchi如果要覆盖现有服务的单位,则可以创建覆盖。如果要像OP一样从头开始创建单元,那将毫无意义。
迈克尔·汉普顿

3

你可以把它添加到/etc/inittabrespawn

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

这是一个肮脏的技巧,但过去我已经在较旧的sysv-init系统上成功使用过它。


但是,守护进程通常不是将calsid()和fork()后台运行吗?
symcbean 2014年

谢谢!正如您所说,这是一个肮脏的骇客,但它确实有效。无论如何,我更喜欢使用systemd。现在我知道它的存在。
Adrian Antunez 2014年

这在RHEL6上不起作用。respawn实用程序似乎不可用。
Djidiouf

2

好吧,这是debian转向systemd的主要原因之一。

sysvinit(/etc/init.d)无法检测到服务是否关闭/没有响应。这意味着您必须监视这些服务,如果某项服务不再起作用,则必须升级。

可能最简单的方法是迁移到另一个daemonhandler,例如systemd(RHEL7中为默认值,在下一个debian和ubuntu lts中为默认值),upstart(RHEL6,Ubuntu 12.04和14.04中为默认值),daemontools(如所述,由develloped by djb)或其他内容。

维持服务存活的工作将是sysvinit中的PITA。


1

最佳实践是确保您的守护程序首先不要停止。

失败的话,您可能想看看DJB的daemontools


3
当然,最佳实践是确保我的守护程序不会停止。但是,有很多应用程序都遵循if-I-stop-wake-me方法,例如apache2,mysql,samba,pulseaudio ...我一直在寻找daemontools,这似乎是一个很好的方法。不幸的是,我不允许安装外部工具。我需要使用bash脚本或start-stop-daemon和init.d配置进行此操作。
Adrian Antunez 2014年

1

对我而言,标准方法是使用Monit实用程序

从您的描述中我无法完全确定您是否编写了类似Monit的内容并试图确保其正在运行,或者是否需要某些东西来监视创建的守护程序。


1
嗨怀特怀特,我必须确保我的应用程序正在运行。不幸的是,我不允许安装外部工具。我需要使用bash脚本或start-stop-daemon和init.d配置进行此操作。
Adrian Antunez 2014年

2
@AdriánAntúnez如果不允许您安装完成工作所需的工具,则应尽快解决此问题。
迈克尔·汉普顿

@AdriánAntúnez您要求“标准”。Monit是众所周知的/备受推崇的。您要求“最佳”……您的约束更多是政治约束。为什么不允许您安装软件?
ewwhite 2014年

1
如果它可以执行您想要的操作,则它不是不必要的工具或依赖项。
ewwhite 2014年

1
@ewwhite抱歉,我的意思是避免依赖外部工具。
Adrian Antunez 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.