Back
Please upgrade your browser or check your network connection.

进程树的PID捕抓问题

在编写脚本的时候可能会遇到进程捕抓PID出错的问题。

场景

当A脚本调用B脚本,B脚本再调用C程序。

A脚本需要获得C程序的PID来进行后续操作。

其实我对B脚本里面的内容根本就不熟悉!

问题

此时的问题就是在于捕获状态的出错问题。

例如:

  • 使用 timeout 来关闭程序或者脚本
1timeout 5 /path/to/slow/command with options
  • 使用jobs: Get PIDSleepKill PID
1_timeout() { ( set +b; sleep "$1" & "${@:2}" & wait -n; kill -9 `jobs -p`; ) }

使用上面的方法都只会捕获到B脚本的PID,而根本就拿不到C程序的PID。

那么就会导致A脚本的后续操作失败。

在这里被坑了半个钟,还是记录一下。

解决方案

实际上,我也没想到有什么优雅的解决方案。

下面的操作,我感觉操作起来都很傻。

  • 在B脚本调用C程序的时候,就将C程序的PID放进环境变量中。
  • A脚本需要调用C程序的时候,使用ps -ef + grep 的方式,将PID提取出来。