Linux下檢測進程是否存在


這個問題看起來好像很簡單,"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:00 bash
15943 pts/0    00:00:00 ps
[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/<pid>目錄。因此我們可以將檢測進程是否存在轉換為檢測/proc/<pid>目錄是否存在,這樣就簡單多了。
 
最后,我們怎么得到進程的pid呢?通常對於daemon進程我們可以從它的pid文件或者lock文件中讀取。如果沒有pid文件的話,在監控腳本中先用"ps | grep"、pgrep、pidof等命令得到要監控的進程pid,再用上述方法檢測就行了。
 
References
1. How do you check in Linux with Python if a process is still running?  http://stackoverflow.com/questions/38056/how-do-you-check-in-linux-with-python-if-a-process-is-still-running
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM