bash shell獲取程序的pid

2021-08-27 04:23:43 字數 783 閱讀 8330

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

bash shell實現併發多程序操作

bash shell實現併發多程序操作 前言目前我掌握的基本語言,php 最為熟悉,專案裡 都是用其實現 bash shell 運維利器 c acm專用 這裡面能實現多執行緒的貌似只有c,但是我c只是用來學習和實現演算法和資料結構,因此工作中我想要模擬多程序併發操作,就只能依靠bash shell指...

python獲取父程序名稱 獲取程序的名稱

對程序的名稱獲取的幾種方法 import time import multiprocessing import os def work1 for i in range 10 print 我是work i,multiprocessing.current process pid ppid獲取父程序的編號...

基本的bash shell 命令

linux man 頁面格式 name顯示命令的名稱和簡介 synopsis顯示命令的格式 description描述每個命令的選項 author 該命令開發人員資訊 reporting bugs提交bug報告途徑 see also推薦檢視相似命令 ps 命令 bsd風格的引數,前面不見破折線 gn...