我试图得到一个管道数据收集命令的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
将关闭它们的输出流。
的可能重复[为什么我不能使用bash脚本作业控制?(http://stackoverflow.com/questions/690266/why-cant-i-use-job-control-in-a-的bash脚本),虽然我不知道,如果是使用bash 2. – Mat
@Mat工作虽然其他问题告诉我:“为什么”它并没有真正提出一个最佳实践“如何”。我认为我的问题很具体。 – Jamie
答案确实告诉你如何。 – Mat