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')");

不需要分叉。上面的所有代码都替换了我的初始代码。