繁体   English   中英

检测systemd的可靠方法

[英]A reliable way to detect systemd

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

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

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

    return false;
}

在我看来,这听起来像是XY问题。 我可以想象出您可能会关心的两个原因:

  1. 您想知道是以前台模式还是守护程序模式运行程序。
  2. 您(可能是可选地)依赖于systemd服务。

将“ daemonize”定义为“(double)fork,并退出要重设到init的父级,并照顾其他步骤,例如放弃控制终端,...”(编辑:systemd维护者已经编写了一个方便的手册手册页: daemon(7) (不要与daemon(3)混淆,这没有用)

传统的守护程序将采用命令行选项:--daemonize(如果默认值在前台运行)或--foreground(如果默认值在后台运行)。 传递那些标志之一的责任属于谁启动了程序(如果是用户)或编写了初始化脚本的人(应该是包装程序 ,而不是上游用户)。

现代实践的趋势已经改变:流程不应自理,而是由守护程序管理器运行,例如start-stop-daemon(8)(同样由打包程序决定)。

现在systemd变得无处不在,一些最佳实践正在发生变化。 例如,上游可以传送一个.service文件,而不是每个打包程序都必须传送自己的变体,并且现在完全没有必要自己实施守护进程。

对于第二种情况,如果要使用systemd的某些服务-只需尝试使用它们,然后像​​往常一样检查错误即可。 对于许多应用程序,您并不想使其成为一个硬错误(如果仅用于开发/测试,可能应该有某种方式可以在不使用systemd的情况下运行您的程序-但这可能需要更改某些config选项,但它没有(很容易),但现在硬性依赖正变得合法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM