2012-08-30 141 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

回答