Linux下檢測程序是否存在

2021-06-26 07:57:30 字數 1334 閱讀 3383

這個問題看起來好像很簡單,"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 顯示存活的主機 ...