编写 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 对使用哪种方法进行了全面比较。
我看到以下选项:
- 编写分叉、调用 setpid、umask 等的应用程序,但这
需要应用程序自己执行许多步骤; (自动启动
通过 init.d?)
- 使用 daemon() init.d 函数为您执行大部分步骤(但它是否可移植到 all/many linux 发行版)
- 运行在后台使用 & 将应用程序信任给 运行
但其中哪一个是要走的路。或者都可以用,Linux中的daemon是什么?
我正在寻找 运行ning 应用程序作为 windows 下的服务的等效项(并且任何 .exe 都可以自动为 运行s 作为服务使用sc).
我的要求如下:
- 开机后启动(自动)
- 运行作为 特定 用户(非 root)
- 可以访问整个文件系统 (/),但可以访问 creates/modifies 个文件作为应用程序 运行
下的用户
- 可以通过服务启动、服务停止
来控制
- 可能会在崩溃或终止后自动重启
- 可以写入系统日志
- 运行 在 RHEL7
下
我是该应用程序的作者,但不想更改它来处理守护进程。
我的猜测是编写自定义 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-failure
或always
)。
- 写入系统日志:您的程序写入标准输出的任何输出都会写入系统日志,可以根据需要通过
journalctl
and/or 写入系统日志来查看。
当 运行 在现代初始化系统下时,您的应用程序不需要(也不应该)自行守护进程。这不仅适用于 systemd,也适用于 upstart,以及像 运行it、daemontools、supervisord 和大多数其他东西这样的主管。守护进程有点挑剔而且容易出错。只需像往常一样编写您的应用程序,然后让 init 系统完成它的工作。
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 对使用哪种方法进行了全面比较。
我看到以下选项:
- 编写分叉、调用 setpid、umask 等的应用程序,但这 需要应用程序自己执行许多步骤; (自动启动 通过 init.d?)
- 使用 daemon() init.d 函数为您执行大部分步骤(但它是否可移植到 all/many linux 发行版)
- 运行在后台使用 & 将应用程序信任给 运行
但其中哪一个是要走的路。或者都可以用,Linux中的daemon是什么?
我正在寻找 运行ning 应用程序作为 windows 下的服务的等效项(并且任何 .exe 都可以自动为 运行s 作为服务使用sc).
我的要求如下:
- 开机后启动(自动)
- 运行作为 特定 用户(非 root)
- 可以访问整个文件系统 (/),但可以访问 creates/modifies 个文件作为应用程序 运行 下的用户
- 可以通过服务启动、服务停止 来控制
- 可能会在崩溃或终止后自动重启
- 可以写入系统日志
- 运行 在 RHEL7 下
我是该应用程序的作者,但不想更改它来处理守护进程。
我的猜测是编写自定义 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-failure
或always
)。 - 写入系统日志:您的程序写入标准输出的任何输出都会写入系统日志,可以根据需要通过
journalctl
and/or 写入系统日志来查看。
当 运行 在现代初始化系统下时,您的应用程序不需要(也不应该)自行守护进程。这不仅适用于 systemd,也适用于 upstart,以及像 运行it、daemontools、supervisord 和大多数其他东西这样的主管。守护进程有点挑剔而且容易出错。只需像往常一样编写您的应用程序,然后让 init 系统完成它的工作。