Linux下检测进程是否存在

这个问题看起来好像很简单,"ps -ef | grep xx"一下就行啦!这样作固然能够,可是若是咱们考究起性能来,这恐怕不是个好办法。python

假设咱们如今要监测某进程是否存活,每分钟检查一次,用上面的办法就要每分钟运行一次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
相关文章
相关标签/搜索