我試圖得到一個管道數據收集命令的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