這個問題看起來好像很簡單,"ps -ef | grep xx"一下就行啦!這樣做當然可以,但是如果我們考究起效能來,這恐怕不是個好辦法。
假設我們現在要監測某程序是否存活,每分鐘檢查一次,用上面的辦法就要每分鐘執行一次ps命令並且做一次grep正則查詢。這點開銷在伺服器上似乎不算什麼,然而如果我們要在同一節點上同時監測數十個、數百個這樣的程序又如何呢?所以,我們有必要從效能的角度出發,發掘一些更好的辦法。
對於daemon程序,通常都會有自己的pid或者lock檔案,我們可以檢查這些檔案是否存在來判斷程序是否存在。然而有些異常情況下,pid檔案存在程序卻並不存在。因此並不能依賴程序的pid檔案來檢測程序是否存活。
一種可靠的方法是使用"kill -0 pid",kill -0不會向程序傳送任何訊號,但是會進行錯誤檢查。如果程序存在,命令返回0,如果不存在返回1。
[sw@gentoo ~
]$ ps
pid tty time cmd
15091 pts/0 00:00:00bash
15943 pts/0 00:00:00ps
[sw@gentoo ~
]$ kill -0 15091
[sw@gentoo ~
]$ echo $?0[
sw@gentoo ~
]$ kill -0 15092
-bash: kill: (15092) - no such process
[sw@gentoo ~]$ echo $?1
[sw@gentoo ~
]$
但是,這種方法對於普通使用者來說只能用於檢查自己的程序,因為向其它使用者的程序傳送訊號會因為沒有許可權而出錯,返回值也是1。
[sw@gentoo ~
]$ kill 2993-bash: kill: (2993) - operation not permitted
[sw@gentoo ~
]$ echo $?1[
sw@gentoo ~
]$
當然,如果你用特權使用者執行kill命令的話,就沒有許可權問題啦。
另一方面,我們知道核心會通過/proc虛擬檔案系統匯出系統中正在執行的程序資訊,每個程序都有乙個/proc/目錄。因此我們可以將檢測程序是否存在轉換為檢測/proc/目錄是否存在,這樣就簡單多了。
最後,我們怎麼得到程序的pid呢?通常對於daemon程序我們可以從它的pid檔案或者lock檔案中讀取。如果沒有pid檔案的話,在監控指令碼中先用"ps | grep"、pgrep、pidof等命令得到要監控的程序pid,再用上述方法檢測就行了。
Linux下判斷是否存在多個同名程序
linux 下如何判斷同名程序的個數,這個可以通過shell命令ps e grep c 所查程序名字 就可以得到程序的個數。這裡給出 實現。bool processnumber char name char buf 255 sprintf cmd,ps e grep c s name if fptr...
Linux下通過程序名檢測程序是否在執行
此方測試可行,其它見注釋。int isrun string procname struct dirent ent readdir lpdir 讀取 proc目錄下面所有目錄 主要是讀取目錄名為數字的檔案,每個執行中的程序在此都有乙個以程序pid為名稱對應的目錄 所以我採取的訪求是依此的將這些目錄下面...
fping 檢測主機是否存在
fping命令 fping類似於ping,但比ping強大。與ping要等待某一主機連線超時或發回反饋資訊不同,fping給乙個主機傳送完資料報後,馬上給下乙個主機傳送資料報,實現多主機同時ping,fping還可以在命令列中指定要ping的主機數量範圍。fping 選項 引數 a 顯示存活的主機 ...