我以前使用init.d/脚本来管理我编写的守护进程,这些守护进程多年来一直完美运行。现在我发现自己需要提供一个systemd/脚本,但我无法让它与我执行守护程序设置代码的方式一起工作。
当我设置一个守护进程时,我分叉两次以释放控制终端并避免成为会话领导者。
问题是我已经确认当你这样做时systemd/会失去跟踪并杀死守护进程。我还确认跳过第二个 fork 可以使其再次与systemd/一起工作。
我的基本(为了讨论的目的稍微简化)systemd/脚本是
[Unit]
Description=GM7 Service Daemon
[Service]
Type=forking
ExecStart=/usr/bin/g7ctrl
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是:我是否需要改变过去十年在 C/C++ 中完成守护进程设置代码的方式,或者是否有选项让 systemd/ 来跟踪双分叉?
我还没有完全了解内部工作原理,如果 systemd 本身为它启动的每个守护进程生成进程,在这种情况下,我的双叉确实会过时
我承认我这样做的方式(双叉)部分是出于历史原因,但当时我对最佳实践进行了一些相当深入的阅读,这就是我后来想到的(大约十年前)
\n\n我是否需要改变过去十年在 C/C++ 中完成守护进程设置代码的方式?
\n
是的。
\n即使在大约十年前,这也不是正确的方法。自 20 世纪 90 年代初以来,AIX 系统资源控制器就一直不太对劲。daemontools 用户从 20 世纪 90 年代末开始就提倡不要这样做。它不适合 Upstart,主流 Linux 操作系统于 2006 年开始采用。它不适合运行inittab
20 世纪 80 年代初的 AT&T System 5 Release 3 的东西。
它不适合 systemd。尽管人们可能会告诉您有关forking
类型的信息,但他们通常会忘记或什至不知道,但要告诉您的是,这是一个特定的服务准备协议,取决于以特定方式完成的双分叉。更糟糕的是,正确表达协议所需的方式与您和其他人编写 C/C++ 程序的方式不能很好地融合。
早在 2008 年,我关于这个主题的常见答案已经存在了大约四分之三的时间,在我把它变成 FGA 形式之前,我和其他人已经告诉人们同样的事情很长一段时间了。
\nIBM 自 1995 年以来一直在红皮书中提到这一点。
\n一些新来的人从 systemd 的角度来看,在 systemd 手册中说了同样的话,时间只有 8 年左右。\xe2\x98\xba
\n让服务管理子系统来处理这一切。当您的程序开始运行时,它已经在 ad\xc3\xa6mon 上下文中执行。
\n如果你真的想让所有依赖于 d\xc3\xa6monization 谬误的代码都为真,那么至少做许多其他人在过去二十年所做的事情(部分是为了回应 daemontools 的人),并给出world 是一个命令行选项,可将其全部关闭。但请不要让该命令行选项充当调试开关的双重职责。
\n