找出以root身份运行的进程是否存在

时间:2013-10-24 17:06:10

标签: python linux process subprocess

我有一个程序需要知道root所拥有的某个进程(也是程序的一部分,但作为守护进程运行)是否存在。该过程使用pkexec从程序内启动,以便程序本身可以作为普通用户运行。

通常,如果我需要知道某个进程是否正在运行,我会使用os.kill(pid, 0)并捕获生成的异常。不幸的是,在这种情况下,无论进程是否存在,Python都只会发出OSError: [Errno 1] Operation not permitted

除了手动解析ps aux | grep myprogram的输出之外,是否有一种简单的方法可以知道进程是否存在而无需诉诸像psutils 这样的外部库?对于这样一个简单的任务来说,psutils似乎是一个非常大的依赖。

2 个答案:

答案 0 :(得分:0)

os.geteuid()

“返回当前进程的有效用户ID。”

root的有效uid为零:

if os.geteuid() == 0:
    print('running as root')
else:
    print('no root for you')

答案 1 :(得分:0)

如果您知道pid,可以使用psutil

if psutil.Process(the_pid).is_running():
    print('Process is running')
else:
    print('Process is *not* running')

奖励积分:这适用于2.4到3.3的python以及linux,OS X,Windows,FreeBSD,Sun Solaris等等。

检查/proc/the-pid是否存在仅适用于* nix机器,而不适用于Windows。

另请注意,只需检查/proc/the-pid 就足以得出流程正在运行的结论。操作系统可以自由地重复使用pid,因此如果进程结束并且使用相同的pid生成了不同的进程,则会被搞砸。

您还必须保存原始流程的创建时间。然后,要检查进程是否存在,您应首先检查/proc/the-pid,然后检查该进程的创建时间是否与您保存的内容相匹配。 psutil会自动执行此操作。