我一直在查找有关在 Linux 上运行后台进程的信息。基本要求是:
- 启动流程并保持其运行,无论发生什么情况
- 如果进程因任何原因退出,立即重新启动
- 能够以特定用户身份启动该进程
此外,有些进程需要定期运行,而不是连续运行。这当然是 cron 的工作,我很可能也会使用它。但对于连续进程来说,情况就不同了。
在 Mac OS X 上,我使用 launchd 来实现此目的。Launched 是规范方法用于在 Mac OS X 上启动进程。操作系统将其用于所有系统服务,因此我完全可以依赖它。到目前为止,我还没有找到适用于 Linux 的类似系统。各种发行版似乎都有自己的方法(Ubuntu 的 upstart 等),但我仍然无法找到关于 /etc/rc.local、/etc/init.d/rc.local、/etc/initd/rc.local 或 /etc/init 之间如何关联以及它们之间有何区别的直接答案。它们在每个系统上都不同。此外,“service start/stop x” 并非在所有系统上都有效(而且 Google 在这方面没有提供帮助),您就会遇到我所说的混乱局面。
我想要的是一个可以保存脚本的地方,在那里我可以重新启动系统,并让它们在启动时作为守护进程启动(在任何用户登录之前),然后如果它们终止,则让它们自动重新启动。我希望它坚如磐石、可靠,并与多个发行版完全兼容,而不是像 upstart 那样事后才想到的。
这可能吗?
答案1
抱歉,Linux 发行版(为了使自己与众不同并给系统管理员的工作制造麻烦而不断追求)在启动方面各自都制定了不同的标准化方式。
对于 Linux 启动脚本来说,最接近“跨发行版标准”的是System V 样式运行级别。这些在某些系统上已被弃用(例如 Ubuntu 的官方立场是您应该使用 Upstart),但它们仍然有效,并且可能还会持续很长一段时间。
如果您的守护进程崩溃,SysV init 脚本不会处理“自动重启” - 它们会启动一个守护进程,该守护进程应该能够自行处理。
如果您需要监督,则需要编写/包含您自己的监督框架。
(或者,只需编写一个不会崩溃的像样的软件,这是处理此问题的传统 Unix 方式。如果您的守护进程非常不稳定,以至于需要额外的监督才能不断重启它,这通常意味着您需要做更多工作来使其达到生产质量。)
答案2
您已经接近 upstart 了 - 您需要的是 systemd。它尚未完全受支持,但可以处理旧式 SysV init 脚本(尽管没有监督),并且可以轻松采用它在许多发行版上运行。目前没有更好的现成解决方案,但如果您不想更改整个 init,您可能会对 monit 守护进程感兴趣,它可以轻松指示监督几乎任何服务。
答案3
我想要的是一个可以保存脚本的地方,在那里我可以重新启动系统,并让它们在启动时作为守护进程启动(在任何用户登录之前),然后如果它们终止,则让它们自动重新启动。我希望它坚如磐石、可靠,并与多个发行版完全兼容,而不是像 upstart 那样事后才想到的。
这不存在。即使你只使用企业 Linux 发行版,你也会发现各种各样的 init 系统,例如
- SysVInit:Red Hat Enterprise Linux 5、SUSE Linux Enterprise 11
- 新贵:Red Hat Enterprise Linux 6
- Systemd:Red Hat Enterprise Linux 7、SUSE Linux Enterprise 12
最“兼容”的方法是编写 sysvinit 脚本,因为 upstart 和 systemd 都支持它们。但是,它不支持在服务死机时自动重启服务。upstart 和 systemd 都支持这一点。