linux下檢測進(jìn)程是否存在 ? ? ? ? ? (推薦學(xué)習(xí):linux運(yùn)維)
這個問題看起來好像很簡單,“ps -ef | grep xx”一下就行啦!這樣做當(dāng)然可以,但是如果我們考究起性能來,這恐怕不是個好辦法。
假設(shè)我們現(xiàn)在要監(jiān)測某進(jìn)程是否存活,每分鐘檢查一次,用上面的辦法就要每分鐘運(yùn)行一次ps命令并且做一次grep正則查找。這點(diǎn)開銷在服務(wù)器上似乎不算什么,然而如果我們要在同一節(jié)點(diǎn)上同時監(jiān)測數(shù)十個、數(shù)百個這樣的進(jìn)程又如何呢?
所以,我們有必要從性能的角度出發(fā),發(fā)掘一些更好的辦法。
對于daemon進(jìn)程,通常都會有自己的pid或者lock文件,我們可以檢查這些文件是否存在來判斷進(jìn)程是否存在。然而有些異常情況下,pid文件存在進(jìn)程卻并不存在。因此并不能依賴進(jìn)程的pid文件來檢測進(jìn)程是否存活。
一種可靠的方法是使用”kill -0 pid”,kill -0不會向進(jìn)程發(fā)送任何信號,但是會進(jìn)行錯誤檢查。如果進(jìn)程存在,命令返回0,如果不存在返回1。
[sw@gentoo?~]$?ps ??PID?TTY??????????TIME?CMD pts/0????00:00:00?bash pts/0????00:00:00?ps [sw@gentoo?~]$?kill?-0?15091 [sw@gentoo?~]$?echo?$? [sw@gentoo?~]$?kill?-0?15092 -bash:?kill:?(15092)?-?No?such?process [sw@gentoo?~]$?echo?$? [sw@gentoo?~]$
但是,這種方法對于普通用戶來說只能用于檢查自己的進(jìn)程,因?yàn)橄蚱渌脩舻倪M(jìn)程發(fā)送信號會因?yàn)闆]有權(quán)限而出錯,返回值也是1。
[sw@gentoo?~]$?kill?2993 -bash:?kill:?(2993)?-?Operation?not?permitted [sw@gentoo?~]$?echo?$? 1 [sw@gentoo?~]$
當(dāng)然,如果你用特權(quán)用戶執(zhí)行kill命令的話,就沒有權(quán)限問題啦。