我正在尝试在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 &" );
安装程序脚本要求tarball作为参数。我尝试过使用sudo,但我仍然遇到同样的问题。我试过nohup但没有成功。安装程序脚本在执行固件升级时必须终止程序,但安装程序脚本将保持活动状态。
如果我的程序是从我的目标设备上的命令行或rc.local运行的,我的升级工作正常,即当我的程序被杀死时,我的安装程序脚本会继续。
但我需要从/ etc / inittab运行我的程序,以便它可以重生,如果它死了。要在inittab中停止我的程序,安装程序脚本会将其哈希并执行“telinit q”。这是我的程序死亡的地方(但这就是我想要它做的事情),但它也会杀死我的安装程序脚本。
有谁知道为什么会这样,我该怎么做才能解决它?
提前致谢。
答案 0 :(得分:0)
我猜这里发生的事情是init不仅将SIGTERM / SIGKILL发送给进程而且发送给整个进程组。这样做是为了确保正确清理过程中的所有子项。当你的程序调用system()时,它将在内部执行fork()/ exec()。这个新分叉的进程与你编程的进程组在同一个进程组中,所以它也会被杀死。
您可以尝试通过执行
在新会话中运行安装程序脚本system( "setsid nohup installer.sh tarball >/dev/null 2>&1 &" );
如果您的系统没有提供setsid命令行实用程序,您只需编写自己的。 setsid只是setsid()系统调用的一个小包装器。