在Python中,如果不使用/proc文件系统,如何判断给定的PID是否在运行?
假设我有一个进程ID,像是555。我想知道这个进程是不是还在运行,或者已经结束了。我可以查看/proc/这个文件夹,但在我的生产环境中我没有权限去访问它。那么,有什么好的方法可以做到这一点,而不是用一些比较“黑科技”的方式,比如打开一个管道去执行“ps”命令呢?
2 个回答
2
可以使用 os.kill()
,正如Greg提到的,但要明白,kill这个系统调用并不是检查进程是否存在,而是检查你是否有权限去终止这个进程。有一种失败的情况是进程根本不存在,但还有一种情况是你没有权限去杀掉它。要区分这两种情况,你需要检查异常:
try:
os.kill(pid, 0)
print 'Process exists and we can kill it'
except OSError, e:
if e.errno == 1:
print 'Process exists, but we cannot kill it'
else:
raise
如果你确定自己总是有权限去终止你要检查的进程,比如你是以root身份运行,或者这个进程是以和你相同的用户身份运行的,那么就不需要进行这个检查。
11
可以使用 os.kill()
这个函数,并传入信号号码0。如果你要检查的进程 pid 存在,那么这个调用就会成功;如果不存在,就会出现一个 OSError
的错误。
try:
os.kill(pid, 0)
print("process exists")
except OSError:
print("process does not exist")
我系统上关于 kill(2)
的文档是这样说的:
kill() 函数会把指定的信号 sig 发送给进程 pid,这个进程可以是单个进程,也可以是一组进程。Sig 可以是 sigaction(2) 中列出的某个信号,或者是0。在后者的情况下,会进行错误检查,但实际上不会发送任何信号。这可以用来检查 pid 是否有效。