Linux守护进程的最佳实践

我一直在查找有关在Linux上运行后台进程的信息。 基本要求是:

  • 不pipe发生什么事情,启动该进程并保持运行
  • 如果程序因任何原因退出,请立即重新启动
  • 能够以特定用户身份启动stream程

另外,有些过程需要不是连续运行,而是定期运行。 这当然是一个cron的工作,而且更有可能是我用它的。 但对于持续的stream程来说,这是一个不同的故事。

在Mac OS X上,我使用launchd来达到这个目的。 Launchd是在Mac OS X上启动进程的标准方法 。操作系统将其用于所有系统服务,所以我毫不犹豫地依赖它。 到目前为止,我还没有find类似的Linux系统。 各种发行版似乎都有自己的方法(Ubuntu的新贵等),我仍然无法find/etc/rc.local,/etc/init.d/rc.local,/ etc / initd /rc.local或/ etc / init都是相关的,它们之间有什么区别。 它们在每个系统上都不相同。 除此之外,“服务启动/停止x”不适用于所有的系统(谷歌在这里没有帮助),你有我所说的一团糟。

我想要的是一个地方,我可以保存我的脚本,在那里我可以重新引导系统,并在启动时(在任何用户login之前)启动守护进程,然后让它们自动重新启动,如果它们终止。 而且我希望它坚如磐石的可靠,完全兼容多个发行版,而不是像新贵那样的事后。

这甚至有可能吗?

对不起,Linux发行版(无限追求差异化,让系统pipe理员生活困难)各自在启动方面做了不同的标准化。

与Linux启动脚本的“交叉分发标准”最接近的是System V风格的运行级别 。 这些在某些系统上被弃用(例如Ubuntu的官方位置是你应该使用Upstart),但是它们仍然可以工作,并且可能会持续很长时间。

如果守护程序崩溃,SysV init脚本不会处理“自动重新启动” – 它们会启动一个守护程序,这个守护程序需要自己处理。
如果你想监督,你需要写/包含你自己的主pipe架构。
(也可以简单地写一个体面的不会崩溃的软件,这是处理这个问题的传统的Unix方式,如果你的守护进程非常不稳定,需要额外的监督来重新启动它,这通常意味着你需要做更多的工作使其产品质量。)

你与新贵密切相关 – 你需要的是systemd。 它还没有完全支持,但处理旧式的SysV初始化脚本(虽然没有监督),可以很容易地采用在许多发行版上运行。 目前没有更好的解决scheme,但是如果您不想更改整个init,您可能会对monit守护进程感兴趣,monit守护进程可以很容易地被指示监督几乎所有的服务。

我想要的是一个地方,我可以保存我的脚本,在那里我可以重新引导系统,并在启动时(在任何用户login之前)启动守护进程,然后让它们自动重新启动,如果它们终止。 而且我希望它坚如磐石的可靠,完全兼容多个发行版,而不是像新贵那样的事后。

这不存在。 即使你将自己限制在企业Linux发行版上,你也会发现各种各样的init系统,例如

  • SysVInit:红帽企业Linux 5,SUSE Linux Enterprise 11
  • 新贵:红帽企业Linux 6
  • Systemd:红帽企业Linux 7,SUSE Linux Enterprise 12

最“兼容”的方式是编写sysvinit脚本,因为新贵和systemd都支持它们。 但是,它不支持自动重启服务。 新贵和systemd都支持这一点。