检测systemd的可靠方法

时间:2014-05-23 22:15:36

标签: c linux daemon systemd

这是检测守护程序是否从systemd启动的可靠方法吗?

#include <systemd/sd-daemon.h> 
#include <unistd.h>   

bool DetectSystemd(void)
{
    if (sd_booted() > 0 && getppid() == 1) {
        return true;
    }

    return false;
}

1 个答案:

答案 0 :(得分:1)

这听起来像是一个XY问题。我可以想象你可能会关心的两个原因:

  1. 您想知道是以前台模式还是守护进程模式运行程序。
  2. 您依赖(可能是可选的)系统服务。
  3. 定义&#34; daemonize&#34; as&#34;(double)fork并退出父级以重新定义到init,以及处理其他步骤,例如放弃控制终端,......&#34; (编辑:systemd维护者编写了一个方便的手册页:daemon(7)(不要与daemon(3)混淆,这是没用的)

    传统守护进程将采用命令行选项:--daemonize(如果默认值在前台运行)或--foreground(如果默认为守护进程)。传递其中一个标志的责任属于启动程序的任何人(如果是用户)或编写init脚本的人(应该是 packager ,而不是上游)。

    现代实践的趋势发生了变化:流程不应该自己处理,而是由守护程序管理器运行,例如start-stop-daemon(8)(再次,打包者的决定)。

    现在systemd正在变得无处不在,一些最佳实践正在发生变化。例如,现在上游可以发送一个.service文件,而不是每个打包者必须发送他们自己的变体,现在自己实现守护步骤完全没有意义。

    对于第二种情况,如果您想使用某些systemd的服务 - 只需尝试使用它们,并检查您应该总是应该的错误。对于许多应用程序,您可能还不想将其变为硬错误(如果仅用于开发/测试,可能应该有一些方式来运行程序,但这可能需要更改一些配置选项,它不一定很容易),但现在硬依赖变得合法。