如何从脚本父脚本获取脚本调用的进程的PID

时间:2013-09-26 18:56:59

标签: bash pid

我有以下问题:我有一个脚本执行内部后台进程:

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

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

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

当我想在第一次通话结束前再次拨打主页时出现问题。这使得如果与第一个调用相关的 myinternalscript-program 在第二个 myinternalscript-program 结束之前结束,则第一次调用 mainscript 仍然是正确的(因为第二次主题调用所调用的 myinternalscript-program )并且第一次 mainscript 调用直到<第二个主语调用的strong> myinternalscript-program 也完成了。

我的解决方案是:

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

“innerpid”在执行 myinternalscript 期间调用了 myinternalscript-program 的PID。

根据其中一个答案的建议,$!在 myinternalscript-program 之后,我可以在 myinternalscript 上提供我需要的PID信息,然后我可以想象某种方法将这些信息传递给 mainscript ,但我没有权限编辑 myinternalscript 。在这种情况下,挑战是:

  

如何在 mainscript 获取 myinternalscript-program PID   没有编辑 myinternalscript

显然我也可以用其他方式暂停 mainscript 执行以解决问题,但如果我原本想做的事情可以实现,那就让我感到困惑。

有任何意见吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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"