在编写脚本的时候可能会遇到进程捕抓PID出错的问题。
场景
当A脚本调用B脚本,B脚本再调用C程序。
A脚本需要获得C程序的PID来进行后续操作。
其实我对B脚本里面的内容根本就不熟悉!
问题
此时的问题就是在于捕获状态的出错问题。
例如:
- 使用
timeout
来关闭程序或者脚本
1timeout 5 /path/to/slow/command with options
- 使用
jobs
:Get PID
⇒Sleep
⇒Kill 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
提取出来。