2012-08-30 102 views
3

我试图得到一个管道数据收集命令的PID在bash脚本,这样我可以杀死进程,一旦另一个(前景)过程已完成。我在数据收集命令中有一个超时,但事先不知道应该多长时间;从几分钟到几个小时。如何在BASH 2.05脚本中获取管道命令的PID?

这个问题How to get the PID of a process in a pipeline是知识性,但没有成功。可能是因为我在使用BASH 2.05(在嵌入式系统上)。

jobs -p命令在命令行上初步测试看起来前途无量。在实践中,我在下面代替用管道命令(ksmon | {various filters} | gzip -c > file),所以“$!” BASH变量ksmon命令给出了管道的最后一个过程,而不是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:/ $ 

Whoohoo!所以,我试图把在一个脚本:

Test:/ $ bash --version 
GNU bash, version 2.05.0(2)-release (arm-Artila-linux-gnu) 
Copyright 2000 Free Software Foundation, Inc. 

奇怪的是,上面的脚本做一个Ubuntu主机上的作品:

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:/ $ 

这是我想要的版本,以获得它的工作。

我该怎么做才能让jobs -p在BASH 2.05脚本中工作,还是有其他选择?

唯一的想法是只减去从$!变量固定数目,但我不知道这是个好主意......

编辑: 我想之所以要杀死管道中的第一个程序是,管道中的所有程序,尤其是gzip将关闭它们的输出流。

+0

的可能重复[为什么我不能使用bash脚本作业控制?(http://stackoverflow.com/questions/690266/why-cant-i-use-job-control-in-a-的bash脚本),虽然我不知道,如果是使用bash 2. – Mat

+0

@Mat工作虽然其他问题告诉我:“为什么”它并没有真正提出一个最佳实践“如何”。我认为我的问题很具体。 – Jamie

+0

答案确实告诉你如何。 – Mat

回答