我有以下问题:我有一个脚本执行内部后台进程:
====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 执行以解决问题,但如果我原本想做的事情可以实现,那就让我感到困惑。
有任何意见吗?
答案 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"