gpt4 book ai didi

linux - 在/etc/inittab 中停止进程会终止生成的进程。在 rc.local 中不会发生

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:05 25 4
gpt4 key购买 nike

当我的程序在 inittab 中运行时,我正在尝试执行固件升级。我的程序将运行 2 个命令。一个用于从 tarball 中提取安装程序脚本,另一个用于执行安装程序脚本。在我的代码中,我使用了 system() 函数调用。这些是下面的 2 个命令字符串,

   system ( "tar zvxf tarball.tar.gz -C / installer.sh 2>&1" );

system( "nohup installer.sh tarball >/dev/null 2>&1 &" );

安装程序脚本需要压缩包作为参数。我试过使用 sudo 但我仍然遇到同样的问题。我试过 nohup 但没有成功。在进行固件升级时,安装程​​序脚本必须终止我的程序,但安装程序脚本将保持事件状态。

如果我的程序是从命令行或 rc.local 运行的,在我的目标设备上,我的升级工作正常,即当我的程序被终止时,我的安装程序脚本继续。

但是我需要从/etc/inittab 运行我的程序,这样它就可以在死掉时重生。要在 inittab 中停止我的程序,安装程序脚本会将其散列并执行“telinit q”。这是我的程序死掉的地方(但这就是我想要它做的),但它也杀死了我的安装程序脚本。

有谁知道为什么会这样,我能做些什么来解决它?

提前致谢。

最佳答案

我猜这里发生的是 init 不仅向进程而且向整个进程组发送 SIGTERM/SIGKILL。它这样做是为了确保正确清理进程的所有子进程。当你的程序调用 system() 时,它会在内部执行一次 fork()/exec()。这个新派生的进程与您编程的进程在同一个进程组中,因此它也会被杀死。

您可以尝试通过执行以下操作在新 session 中运行安装程序脚本

system( "setsid nohup installer.sh tarball >/dev/null 2>&1 &" );

如果您的系统不提供 setsid 命令行实用程序,您可以自己编写。 setsid 只是 setsid() 系统调用的一个小包装器。

关于linux - 在/etc/inittab 中停止进程会终止生成的进程。在 rc.local 中不会发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2976638/

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