在退出脚本之前等待后台进程完成

ego*_*ulz 54 unix bash shell grep tcl

在退出脚本(TCL/Bash)之前,如何确保所有后台进程都已完成执行.

我正在考虑将所有后台进程pid写入pidfile.然后在最后pgrep pidfile,看看在退出之前是否有任何进程仍在运行.

有没有更简单的方法来做到这一点?有没有TCL特定的方法来做到这一点?

Wil*_*ell 125

如果您想等待工作完成,请使用wait.这将使shell等待所有后台作业完成.但是,如果你的任何作业自己守护,它们不再是shell的子代,等待就没有效果了(就shell而言,这个孩子已经完成了.事实上,当一个进程守护自己时,它会这样做通过终止和产生一个继承其角色的新进程来实现.

#!/bin/sh
{ sleep 5; echo waking up after 5 seconds; } &
{ sleep 1; echo waking up after 1 second; } &
wait
echo all jobs are done!
Run Code Online (Sandbox Code Playgroud)


Suk*_*uku 10

您可以使用它kill -0来检查特定pid是否正在运行.

假设您在pwd中pid调用的文件中有数字列表pid

while true;
do 
    if [ -s pid ] ; then
        for pid in `cat pid`
        do  
            echo "Checking the $pid"
            kill -0 "$pid" 2>/dev/null || sed -i "/^$pid$/d" pid
        done
    else
        echo "All your process completed" ## Do what you want here... here all your pids are in finished stated
        break
    fi
done
Run Code Online (Sandbox Code Playgroud)

  • 一般情况下,您**无法确定您正在测试的PID是否仍然可以识别您的过程.由于PID回收,可能会发生某些其他过程将获得您正在测试的PID.有关Linux中PID回收的更多信息,请访问:http://goo.gl/eZceq2 (4认同)