我添加了一个antry/etc/inittab
来重生一个二进制文件。条目是这样的:
id:2:respawn:/path-to-my-bin
然后我执行init q
,该过程由 启动inittab
。如果我终止该进程,它就会重新生成。
问题
当我执行以下操作时,会发生奇怪的行为:
- 手动运行
/path-to-my-binary
- 将上面的条目添加到
/etc/inittab
- 跑步
init q
结果:进程重新生成,即使它已经在运行。
此外,如果二进制文件设置为在启动时以init.d
运行级别 2 运行,则inittab
它会在启动时立即重新生成。
答案1
简单的答案是:不要这样做。
如果您希望根据配置处理您的进程,则/etc/inittab
不得手动或在其他地方启动它。
init
如果进程的命令与 中的条目匹配,则不会检查现有进程inittab
。它只监视它的子进程,即由init
它自己启动的进程。
当您运行 时init q
,该init
进程知道它尚未(尚未)为您的线路启动进程id:2:respawn:/path-to-my-bin
并启动它。
不幸的是我不知道这是在哪里明确指定的。
对我来说,很明显一定是这样,原因如下:
init
当子进程终止时会收到一个信号,因此它可以获取进程的状态,检查规范inittab
并在必要时重新启动进程。这是基于事件的。对于不相关的进程,这是不可能的,因此init
必须检查所有进程。这可能是民意调查。init
不知道一个单独的进程执行与其中一行相同的命令的目的是什么inittab
。运行该进程的第二个实例可能是也可能不是所需的行为。- 如果您在已经根据 启动实例后手动启动程序,您会期望
init
做什么?如果由 启动的进程稍后终止怎么办?或者如果其他进程稍后终止?init
inittab
inittab
由于存在许多悬而未决的问题,因此很自然地init
只处理其子进程并忽略任何不相关的进程。