bash shell獲取進程的pid

        前幾天在寫一個腳本時在獲取進程的pid時出現了一點點意外,當時的情境大概是這樣的:跑一個任務A,然後任務B要監控A的狀態,一旦A結束,B也要結束。當初第一反應就是獲取B的pid然後判斷A是否在運行,如果沒有則kill掉B。可是當初就是不成功(用的是 $!),於是迫於任務緊急換了一種笨方法:讓B的運行時間稍長於A任務(A任務的時間可以估算出來),於是就這樣傻缺的開始了這個任務。

       今天再一次有同樣的需求,於是下定決心要弄明白上次爲什麼失敗。後來終於發現了原因:當我們獲取一個進程的pid時有一個最重要的條件:這個進程必須存在。當初大概的做法是這樣的:

command A

comand B

pid=$!

if A is not exists

kill $pid

結果發現A運行完了但是B還在跑,那麼這是什麼原因呢?

因爲command B 這種是阻塞式的命令,所以在B一直運行期間就將pid=$!阻塞住了,因此直到B運行完了pid=$!才能執行,而此時B已經運行完了,所以得到B的進程pid也就沒有實際意義,因此最後pid的值實際上就是空了,因此接下來的kill $pid自然也就失敗了。因此我們需要做的是command B&,讓這個命令在後臺運行,因此也就能讓pid=$!執行,這樣也就得到了上一個進程的pid。

        另外如果要獲得一個當前腳本的進程號可以使用$$。


         這幾天寫腳本比較多,也出了很多錯,總結起來就是bash shell腳本很容易因爲細節問題而導致你意想不到的結果,因此在真正跑任務之前一定要模擬一點數據進行實踐,否則等你期待的去分析腳本的結果時你會發現之前的白費功夫,浪費時間~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章