C++ 运行 一个命令从它的 parent 中分离出来所以 parent 可以死掉 w/o 杀死它的 child
C++ Run a command detached from its parent so the parent can die w/o killing its child
自上周以来,我未能为我的程序实现更新功能。我已将所有内容打包到 *.ipk 文件中,因此可以使用包管理器 opkg installed/updated。
包本身是 systemd 感知的,并且会 stop/disable start/enable 在它认为必要时重新启动服务。
脚本本身调用 opkg install 作为唯一重要的部分。其他一切都是为了调试目的,这根本没有帮助。
if ( fork() == 0 ) {
setsid();
if ( fork() == 0 ) {
setsid();
setpgid(0, 0);
daemon(0, 0);
execl("/etc/ifmii/scripts/update.sh", (char*)0);
} else {
wait(nullptr);
std::this_thread::sleep_for(std::chrono::milliseconds(20000));
_exit(0);
}
}
上面的代码是我试用的结果。叉子确实叉了,但它没有从 parent 上正确分离。
我可以确认,脚本和安装命令至少是 startet。但是安装失败。
我怀疑安装失败是因为 systemd 停止了调用更新命令的 parent 进程,并且所有 children 都死了。
我还能尝试什么?我的方法有问题吗?人们通常如何做到这一点?
我如何从程序中 运行 一个 command/script 在它调用的 script/command 之前退出?
好的。我想我找到了答案。
我将 system() 调用与 systemd-运行 一起使用。有了这个,任何命令都可以 运行 完全不知道任何父子关系。
system("systemd-run opkg install --force-reinstall --force-downgrade --force-overwrite $(find /media -type f ! -path '*\.*/*' -iname '*.ipk')");
不需要分叉。上面的所有代码都替换了我的初始代码。
自上周以来,我未能为我的程序实现更新功能。我已将所有内容打包到 *.ipk 文件中,因此可以使用包管理器 opkg installed/updated。
包本身是 systemd 感知的,并且会 stop/disable start/enable 在它认为必要时重新启动服务。
脚本本身调用 opkg install 作为唯一重要的部分。其他一切都是为了调试目的,这根本没有帮助。
if ( fork() == 0 ) {
setsid();
if ( fork() == 0 ) {
setsid();
setpgid(0, 0);
daemon(0, 0);
execl("/etc/ifmii/scripts/update.sh", (char*)0);
} else {
wait(nullptr);
std::this_thread::sleep_for(std::chrono::milliseconds(20000));
_exit(0);
}
}
上面的代码是我试用的结果。叉子确实叉了,但它没有从 parent 上正确分离。
我可以确认,脚本和安装命令至少是 startet。但是安装失败。
我怀疑安装失败是因为 systemd 停止了调用更新命令的 parent 进程,并且所有 children 都死了。
我还能尝试什么?我的方法有问题吗?人们通常如何做到这一点?
我如何从程序中 运行 一个 command/script 在它调用的 script/command 之前退出?
好的。我想我找到了答案。
我将 system() 调用与 systemd-运行 一起使用。有了这个,任何命令都可以 运行 完全不知道任何父子关系。
system("systemd-run opkg install --force-reinstall --force-downgrade --force-overwrite $(find /media -type f ! -path '*\.*/*' -iname '*.ipk')");
不需要分叉。上面的所有代码都替换了我的初始代码。