2016-05-31 112 views
3

什么是在Linux下编写/配置应用程序的正确方式,该应用程序一直运行并为外部请求(TCP,数据库,文件系统及其任何类型)提供服务。编写一个linux守护进程

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

我已经看过多个主题,其中包括:

Linux daemonize

best way to write a linux daemon

Best practice to run Linux service as a different user

但他们没有给出关于要使用的方法全面的比较。

我看到以下选项:

  • 其中叉书面申请,要求setpid,umask的,等等。但这 需要应用本身进行许多步骤; (由init.d中自动启动 ?)
  • 使用守护进程()的init.d函数执行大部分的这些步骤你(但它移植到所有/许多Linux发行版)
  • 与&和信任正在运行的应用它在后台运行

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

我正在寻找一个相当于正在运行的应用程序作为windows下的服务(并且任何.exe可以自动作为使用sc的服务运行)。


我的要求如下:开机后

  • 启动(自动)
  • 运行作为具体用户(不是root)
  • 访问整个文件系统(/),但创建/修改文件作为运行应用程序的用户
  • 可以通过控制服务启动服务站
  • 可能会自动崩溃后重新启动或杀死
  • 可以写入到系统日志RHEL7
  • 运行

我的应用程序的作者,但宁愿不改变它来处理守护进程。

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

回答

6

RHEL7使用systemd作为其初始系统,它将照顾您的大部分需求。你应该为你的守护进程编写一个systemd unit file(用systemd的说法叫做service)。它可以:

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

在现代init系统下运行时,您的应用程序不需要(也不应该)自我守护。这不仅适用于systemd,也适用于新手,以及像runit,daemontools,supervisord和其他所有内容的主管。守护进程有点挑剔,容易出错。只需像通常那样编写应用程序,并让init系统执行它的操作。

2

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

+0

我认为它,但我试图找到更便携的方式,特别是在不同的Linux发行版之间。 – Mios

+0

@Mios您的一个需求是在RHEL7下运行,而不是其他Linux发行版。 – CDahn

+1

我绝对不想陷入SystemD的火焰战中,但是......你们之后有哪些发行版?有[许多不Systemd(http://without-systemd.org/wiki/index.php/Main_Page#Free.2FOpen_Source_Operating_systems_without_systemd_in_the_default_installation),但是如果你不指望BSD和嵌入式老,有没有剩下多少有。即使是Debian [继续](http://arstechnica.com/information-technology/2015/05/debian-8-linuxs-most-reliable-distro-makes-its-biggest-change-since-1993/)到SystemD 。 –