bash shell獲取程序的pid
阿新 • • 發佈:2019-02-15
前幾天在寫一個指令碼時在獲取程序的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指令碼很容易因為細節問題而導致你意想不到的結果,因此在真正跑任務之前一定要模擬一點資料進行實踐,否則等你期待的去分析指令碼的結果時你會發現之前的白費功夫,浪費時間~