0

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

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

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

    return false;
}
4

1 回答 1

1

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

  1. 你想知道是在前台模式还是在后台模式下运行你的程序。
  2. 您依赖(可能是可选的)systemd 服务。

将“daemonize”定义为“(双)分叉并退出父级以重新设置为 init,以及处理其他步骤,例如放弃控制终端,......”(编辑:systemd 维护人员编写了一个方便的手册页:(daemon(7)不要与 混淆daemon(3),这没有用)

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

现代实践的趋势已经改变:进程不应该照顾自己,而是由守护进程管理器运行,例如 start-stop-daemon(8) (再次由打包者决定)。

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

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

于 2014-05-24T01:36:09.287 回答