编写linux守护程序

时间:2016-05-31 13:58:41

标签: c linux daemon rhel

在Linux下编写/配置应用程序的 正确方法是什么?它始终运行并提供外部请求(TCP,数据库,文件系统,任何类型)。

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

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

Linux daemonize

best way to write a linux daemon

Best practice to run Linux service as a different user

但是没有一个能够充分比较使用哪种方法。

我看到以下选项:

  • 编写应用程序,分叉,调用setpid,umask等但是这个 要求应用程序自己执行许多步骤; (使用自动启动 通过init.d?)
  • 使用daemon()init.d函数为您执行大部分步骤(但它可以移植到所有/许多Linux发行版)
  • 使用&运行应用程序并相信它在后台运行

但是他们中哪一个 的方式去了。或者,如果它们都可以使用,那么Linux中守护进程的构成是什么?

我正在寻找相当于在Windows下运行应用程序的服务(任何.exe都可以自动生成,作为使用 sc 的服务运行。)

我的要求如下:

  • 启动后自动启动
  • 特定用户(非root用户)
  • 运行
  • 可以访问整个文件系统(/),但可以创建/修改文件作为运行应用程序的用户
  • 可以通过服务启动服务停止
  • 进行控制
  • 可能会在崩溃或终止后自动重启
  • 可以写入syslog
  • 在RHEL7下运行

我是该应用程序的作者,但不希望改变它以处理守护进程。

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

2 个答案:

答案 0 :(得分:6)

RHEL7使用 systemd 作为其初始化系统,它将满足您的大部分要求。您应该为您的守护程序编写一个systemd unit file(在systemd用语中称为service)。然后它可以:

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

在现代init系统下运行时,您的应用程序不需要(也不应该)守护自身。这不仅适用于systemd,也适用于暴发户,以及runit,daemontools,supervisord和其他大多数主管。守护进程有点挑剔,容易出错。只需按照惯例编写应用程序,然后让init系统完成它的工作。

答案 1 :(得分:2)

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