[英]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问题。 我可以想象出您可能会关心的两个原因:
将“ 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.