如何在 Kickstart 期间后台运行 shell 脚本?

bxm*_*bxm 7 linux shell bash kickstart

我有一个 Red Hat Kickstart 进程,它通过对状态服务器的 POST 请求报告关键点的进度。

这在%preand期间很好%post,但是当它们之间发生实际构建时,这是一个信息黑洞。

我写了一个简单的 shell 片段,报告安装的软件包数量,以粗略地了解进度。我已将以下内容放入%pre

%pre

## various other stuff here, all works fine ##

cat > /tmp/rpm_watcher.sh << EOF_RPM
PREV=-1
while true
do
    COUNT="\$(rpm -qa | wc -l)"
    if [ \${COUNT} -ne \${PREV} ] ; then
        /bin/wget --post-data " ${Hostname} : Package count \${COUNT}" ${builddest}/log
        PREV=\${COUNT}
    fi
    sleep 15
done
EOF_RPM
/bin/sh /tmp/rpm_watcher.sh &
disown -a
%end
Run Code Online (Sandbox Code Playgroud)

但是,当我从%pre上面启动它作为后台任务时,它挂起等待脚本结束 -%pre永远不会完成(如果我杀死生成的脚本%pre完成并且构建正确开始)。

我无法使用,nohup因为它在预安装环境中不可用,使用at now和 也是如此screen

我尝试使用disown -a,这是可用的;这似乎成功地否认了该进程(因此它归 PID 1 所有),但它仍然挂起等待脚本完成。

谁能给我一个替代方案?

slm*_*slm 1

如果您将脚本中的 while 循环设置为背景,而不是让脚本背景化,如下所示:

while true
do
    COUNT="\$(rpm -qa | wc -l)"
    if [ \${COUNT} -ne \${PREV} ] ; then
        /bin/wget --post-data " ${Hostname} : Package count \${COUNT}" ${builddest}/log
        PREV=\${COUNT}
    fi
    sleep 15
done &
Run Code Online (Sandbox Code Playgroud)

done请注意,我在循环行的末尾添加了“&”号while

参考