编写 linux 守护进程

Writing a linux daemon

write/configure 应用程序在 Linux 下的 write/configure 正确方法是什么,运行 一直服务于外部请求(TCP 、数据库、文件系统,任何一种)。

我特别不调用这个守护进程,因为它可能意味着我不希望它在 Linux 环境中调用它。

我已经阅读了多个主题,包括:

Linux daemonize

best way to write a linux daemon

Best practice to run Linux service as a different user

但其中 none 对使用哪种方法进行了全面比较。

我看到以下选项:

但其中哪一个是要走的路。或者都可以用,Linux中的daemon是什么?

我正在寻找 运行ning 应用程序作为 windows 下的服务的等效项(并且任何 .exe 都可以自动为 运行s 作为服务使用sc).


我的要求如下:

我是该应用程序的作者,但不想更改它来处理守护进程。

我的猜测是编写自定义 init.d 脚本,然后从 /etc/init.d/functions 调用 daemon() 函数。我说得对吗?

如果我理解正确,特别是关于 RHEL 7 的要求,Systemd Unit is your friend。如果您出于任何原因尝试或放弃了它,请进一步说明。

RHEL7 使用 systemd 作为它的初始系统,它将满足你的大部分需求。你应该用 systemd 的说法写一个 systemd unit file for your daemon (called a service)。然后它可以:

  • 自动启动:是的,systemctl enable yourservice
  • 运行 作为特定用户:是的,在您的单元文件中设置一个 User 键。
  • 有权访问整个文件系统:是的,它将拥有您配置的用户拥有的所有权限,并以该用户身份创建文件。
  • 可以通过service start控制:是的,或者通过systemctl start
  • 崩溃后自动重启:是的,在你的单元文件中设置一个Restart键(例如,on-failurealways)。
  • 写入系统日志:您的程序写入标准输出的任何输出都会写入系统日志,可以根据需要通过 journalctl and/or 写入系统日志来查看。

当 运行 在现代初始化系统下时,您的应用程序不需要(也不应该)自行守护进程。这不仅适用于 systemd,也适用于 upstart,以及像 运行it、daemontools、supervisord 和大多数其他东西这样的主管。守护进程有点挑剔而且容易出错。只需像往常一样编写您的应用程序,然后让 init 系统完成它的工作。