1

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

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

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

4

2 回答 2

1

os.geteuid()

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

root 的有效 uid 为零:

if os.geteuid() == 0:
    print('running as root')
else:
    print('no root for you')
于 2013-10-24T17:24:14.973 回答
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自动执行此操作。

于 2013-10-24T18:04:14.953 回答