【问题标题】:How to get the PID of a process called by a script from the script parent script如何从脚本父脚本中获取脚本调用的进程的PID
【发布时间】:2013-09-26 18:56:59
【问题描述】:

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

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

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

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

当我想在第一次通话结束之前再次调用 ma​​inscript 时,问题就来了。这使得如果与第一个调用相关的 myinternalscript-program 在第二个 myinternalscript-program 完成之前结束,则第一次调用 ma​​inscript的暂停条件> 仍然正确(因为 myinternalscript-program 被第二个 ma​​inscript 调用调用)并且第一个 ma​​inscript 调用直到 ma​​inscript 调用才前进由第二个 ma​​inscript 调用的 strong>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-program 在执行 myinternalscript 期间调用的 PID。

正如其中一个答案所建议的那样,$!在 myinternalscript-program 可以为我提供我在 myinternalscript 上需要的 PID 信息之后,然后我可以想象某种方式将这些信息提供给 ma​​inscript,但我没有编辑 myinternalscript 的权限。在这种情况下,挑战是:

如何在 ma​​inscript 获取 myinternalscript-program PID 不编辑 myinternalscript

显然我也可以使用其他方式暂停 ma​​inscript 执行以解决问题,但我很困惑我最初想做的事情是否可以实现。

有没有cmets?

【问题讨论】:

    标签: bash pid


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以从其他终端中的脚本创建 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-06-02
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-03
        • 2022-10-19
        相关资源
        最近更新 更多