0

我有以下问题:我有一个通过以下方式执行内部后台进程的脚本:

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

从等待myinternalscript-program终止的脚本调用:

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

当我想在第一次通话结束之前再次调用mainscript时,问题就来了。这使得如果与第一个调用相关的myinternalscript -program在第二个myinternalscript-program完成之前结束,则第一次调用mainscript的暂停条件仍然为真(因为第二个mainscript调用调用了myinternalscript-program)和第一个mainscript在第二个主脚本调用的myinternalscript -program也完成之前,调用不会前进。

我的解决方案是:

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

其中“internalpid”具有在执行myinternalscript期间调用的myinternalscript-program的 PID 。

正如其中一个答案所建议的那样,$!在myinternalscript-program可以给我我在myinternalscript上所需的 PID 信息之后,我可以想象某种方式将该信息获取到mainscript,但我没有编辑myinternalscript的权限。在这种情况下,挑战是:

如何在 不编辑myinternalscript的情况下在mainscript中获取myinternalscript-program PID ?

显然我也可以使用其他方式暂停mainscript执行来解决问题,但是如果我最初想做的事情是否可以实现,我会感到困惑。

任何意见?

4

2 回答 2

0

当前脚本的 PID 在 $$ bash 变量中。无需解析 ps 输出。

于 2013-09-26T19:20:58.897 回答
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

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

script1.sh &
script2.sh &
wait
echo "scripts finished"
于 2013-09-26T19:29:15.383 回答