/etc/inittab respawn 已经运行的进程,Debian9

/etc/inittab respawn 已经运行的进程,Debian9

我添加了一个antry/etc/inittab来重生一个二进制文件。条目是这样的:

id:2:respawn:/path-to-my-bin

然后我执行init q,该过程由 启动inittab。如果我终止该进程,它就会重新生成。

问题

当我执行以下操作时,会发生奇怪的行为:

  1. 手动运行/path-to-my-binary
  2. 将上面的条目添加到/etc/inittab
  3. 跑步init q

结果:进程重新生成,即使它已经在运行。

此外,如果二进制文件设置为在启动时以init.d运行级别 2 运行,则inittab它会在启动时立即重新生成。

答案1

简单的答案是:不要这样做。

如果您希望根据配置处理您的进程,则/etc/inittab不得手动或在其他地方启动它。

init如果进程的命令与 中的条目匹配,则不会检查现有进程inittab。它只监视它的子进程,即由init它自己启动的进程。
当您运行 时init q,该init进程知道它尚未(尚未)为您的线路启动进程id:2:respawn:/path-to-my-bin并启动它。


不幸的是我不知道这是在哪里明确指定的。
对我来说,很明显一定是这样,原因如下:

  1. init当子进程终止时会收到一个信号,因此它可以获取进程的状态,检查规范inittab并在必要时重新启动进程。这是基于事件的。对于不相关的进程,这是不可能的,因此init必须检查所有进程。这可能是民意调查。
  2. init不知道一个单独的进程执行与其中一行相同的命令的目的是什么inittab。运行该进程的第二个实例可能是也可能不是所需的行为。
  3. 如果您在已经根据 启动实例后手动启动程序,您会期望init做什么?如果由 启动的进程稍后终止怎么办?或者如果其他进程稍后终止?initinittabinittab

由于存在许多悬而未决的问题,因此很自然地init只处理其子进程并忽略任何不相关的进程。

相关内容