gpt4 book ai didi

c++ - 有什么方法可以避免 systemctl 在停止时杀死我的一个子进程?

转载 作者:太空狗 更新时间:2023-10-29 22:58:57 27 4
gpt4 key购买 nike

我一直在尝试通过运行简单的 Debian 升级命令从服务器内部进行升级:

sudo apt-get upgrade

但是,如果升级包括我自己(即说我有一个名为 server 的包并且部分升级包括更新版本的 server,)则升级失败.更准确地说,每当 dpkg 运行 preinst脚本,运行前面显示的命令的进程被杀死,因为它运行 systemctl stop server .

代码是这样的:

// start with systemd
systemctl start server

// the server runs another daemon which manages the computer packages
// this is C++ code within server doing something like:
if(fork() == 0)
{
execv("package_manager", ...);
}

// if I look at the output of systemctl status server, I see:
systemctl status server
CGroup: server
+-- package_manager

// then package_manager decides to do an upgrade, it starts a process
system("do_server_upgrade");

// in the do_server_upgrade code, I use fork() again to leave the
// existing set of daemons (server and package_manager)
int main()
{
if(fork() != 0)
{
return 0;
}
setsid();
signal(SIGHUP, SIG_IGN);
...run the commands to apply the upgrades...
}

根据 this stackoverflow answer,我了解到 systemd 将杀死(发送 SIGTERM)同一 control-group 中的所有子进程.

所以我认为这对于服务器运行的所有其他守护进程来说是一个很好的功能...除了那个 do_server_upgrade .换句话说,我希望保持这种方式(即 KillMode=control-group ),但看起来没有办法让子进程脱离该控制组。

我的问题是:有人知道这种能力吗?我可以将我的服务设置为 control-group 吗?并将某些进程踢出该控制组?

最佳答案

您可以要求 systemd 使用 systemd-run command 在新的控制组内启动进程.

关于c++ - 有什么方法可以避免 systemctl 在停止时杀死我的一个子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38471241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com