我正在尝试在 BASH 脚本中获取管道数据收集命令的 PID,以便在另一个(前台)进程完成后终止该进程。我的数据收集命令超时,但我事先不知道应该多长时间;几分钟到几个小时不等。
这个问题How to get the PID of a pipeline in a pipeline提供了丰富的信息,但没有成功。可能是因为我使用的是 BASH 2.05(在嵌入式系统上)。
该命令在命令行上的初步测试jobs -p
看起来很有希望。在实践中,我将ksmon
下面的命令替换为管道命令 ( ksmon | {various filters} | gzip -c > file
),因此 " $!
" BASH 变量给出了管道中的最后一个进程,而不是ksmon
我试图杀死的程序:
Test:/ $ ksmon > /dev/null & jobs -p
[1] 2016
2016
Test:/ $ ps | grep ksmon
2016 root 660 S ksmon
2018 root 580 S grep ksmon
Test:/ $ kill $(jobs -p)
[1]+ Terminated ksmon >/dev/null
Test:/ $ ps | grep ksmon
2021 root 580 S grep ksmon
Test:/ $
哇哦!所以我试图把它放在一个脚本中:
Test:/ $ cat > test.sh << EOF
> #!/bin/bash
> # That's bash 2.05
> ksmon > /dev/null & jobs -p
> EOF
Test:/ $ chmod 755 test.sh
Test:/ $ ./test.sh
Test:/ $
Test:/ $ # Nothing ...
Test:/ $ ps | grep ksmon
2025 root 660 S ksmon
2027 root 580 S grep ksmon
Test:/ $ jobs -p
Test:/ $
这是我试图让它工作的版本:
Test:/ $ bash --version
GNU bash, version 2.05.0(2)-release (arm-Artila-linux-gnu)
Copyright 2000 Free Software Foundation, Inc.
奇怪的是,上面的脚本确实适用于 Ubuntu 主机。
我必须做什么才能jobs -p
在 BASH 2.05 脚本中工作,还是有替代方法?
一个想法是从$!
变量中减去一个固定数字,但我不确定这是否是个好主意......
编辑:
我想杀死管道中的第一个程序的原因是管道中的所有程序,特别是gzip
在关闭它们的输出流方面会做得很好。