我有一个程序需要知道root所拥有的某个进程(也是程序的一部分,但作为守护进程运行)是否存在。该过程使用pkexec
从程序内启动,以便程序本身可以作为普通用户运行。
通常,如果我需要知道某个进程是否正在运行,我会使用os.kill(pid, 0)
并捕获生成的异常。不幸的是,在这种情况下,无论进程是否存在,Python都只会发出OSError: [Errno 1] Operation not permitted
。
除了手动解析ps aux | grep myprogram
的输出之外,是否有一种简单的方法可以知道进程是否存在而无需诉诸像psutils 这样的外部库?对于这样一个简单的任务来说,psutils似乎是一个非常大的依赖。
答案 0 :(得分:0)
“返回当前进程的有效用户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
会自动执行此操作。