2013-09-26 28 views
0

我有以下问题:我有一个由执行内部后台进程的脚本:如何获得一个由脚本父脚本中的脚本调用进程的PID

====myinternalscript==== 
... 
myinternalscript-program & 
... 

这是从一个叫通过对myinternalscript程序终止等待脚本:

====mainscript==== 
... 
myinternalscript 
while [ "$(ps -u ${CURRENT_USER} | grep myinternalscript-program)" ]; 
... 

问题是当我想再次拨打mainscript第一次调用之前结束。这使得,如果与第一通话myinternalscript程序第二myinternalscript程序之前结束第一个呼叫mainscript结束,暂停状态仍然为真(因为由称为myinternalscript程序第二mainscript调用)和第一mainscript调用不会前进,直到第二mainscript称为myinternalscript程序也完成。

我的解决办法是:

====mainscript==== 
... 
myinternalscript 
internalpid = #some way to get the myinternalscript-program PID 
while [ "$(ps -u ${CURRENT_USER} | grep myinternalscript-program| grep $internalpid)" ]; 
... 

其中 “internalpid” 有myinternalscript的执行过程中被称为myinternalscript程序的PID。

正如其中一个答案所示,$!在myinternalscript程序后可以给我我需要在myinternalscript PID信息,然后我可以想像一些方法来获取这些信息mainscript,但我没有权限编辑myinternalscript。在此背景下面临的挑战是:

如何得到myinternalscript程序 PID在mainscript 没有编辑myinternalscript

很显然,我也可以使用一些其他的方式来暂停mainscript执行来解决问题,但它让我为难,如果我想做的事本来可以实现的。

有何评论?

回答

0

当前脚本的PID位于$$ bash变量中。不需要解析ps输出。

0

您可以从其他终端的脚本中创建PID文件。

echo $$ > /tmp/script1.pid 

,然后你必须检查它在脚本

checkpid=$(cat /tmp/script1.pid) 
while [ "x$(ps $checkpid | grep -v PID)" != "x" ];do echo still running;sleep 1;done 

,或者如果可以运行在同一个终端脚本(我多少知道你需要运行它平行),你可以在后台运行并使用“等待”关键字等待后台作业:

script1.sh & 
script2.sh & 
wait 
echo "scripts finished" 
相关问题