【问题标题】:Writing a linux daemon编写一个 linux 守护进程
【发布时间】:2023-03-26 10:53:01
【问题描述】:

什么是在 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)运行
  • 有权访问整个文件系统 (/),但以运行应用程序的用户身份创建/修改文件
  • 可以通过service start、service stop来控制
  • 可能在崩溃或终止后自动重启
  • 可以写入系统日志
  • 在 RHEL7 下运行

我是该应用程序的作者,但不希望对其进行更改以处理守护进程。

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

【问题讨论】:

    标签: c linux daemon rhel


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我考虑过,但我尝试找到更便携的方式,尤其是在不同的 Linux 发行版之间。
      • @Mios 您的要求之一是在 RHEL7 下运行,而不是在其他 Linux 发行版下运行。
      • 我绝对不想卷入 SystemD 的火焰战争中,但是……您想要哪些发行版?有many without Systemd,但如果你不算BSD和嵌入式和旧的,那里就没有什么了。甚至 Debian moves on 到 SystemD。
      猜你喜欢
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 2017-05-18
      • 2011-03-06
      • 2011-06-25
      • 1970-01-01
      • 2010-11-15
      • 2014-04-12
      相关资源
      最近更新 更多