如何在 Linux 上使用 Python 检查进程是否仍在运行?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/38056/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to check if a process is still running using Python on Linux?
提问by Andreas Thomas
采纳答案by Aaron Maenpaa
Mark's answer is the way to go, after all, that's why the /proc file system is there. For something a little more copy/pasteable:
Mark 的回答是要走的路,毕竟这就是 /proc 文件系统存在的原因。对于更多复制/粘贴的东西:
>>> import os.path
>>> os.path.exists("/proc/0")
False
>>> os.path.exists("/proc/12")
True
回答by Mark Harrison
on linux, you can look in the directory /proc/$PID to get information about that process. In fact, if the directory exists, the process is running.
在 linux 上,您可以查看目录 /proc/$PID 以获取有关该进程的信息。实际上,如果目录存在,则进程正在运行。
回答by dF.
It should work on any POSIX system (although looking at the /proc
filesystem, as others have suggested, is easier if you know it's going to be there).
它应该适用于任何 POSIX 系统(尽管/proc
正如其他人所建议的那样,查看文件系统会更容易,如果您知道它将在那里)。
However: os.kill
may also fail if you don't have permission to signal the process. You would need to do something like:
但是:os.kill
如果您无权向进程发送信号,也可能会失败。您需要执行以下操作:
import sys
import os
import errno
try:
os.kill(int(sys.argv[1]), 0)
except OSError, err:
if err.errno == errno.ESRCH:
print "Not running"
elif err.errno == errno.EPERM:
print "No permission to signal this process!"
else:
print "Unknown error"
else:
print "Running"
回答by Marius
But is this reliable? Does it work with every process and every distribution?
但这可靠吗?它是否适用于每个流程和每个发行版?
Yes, it should work on any Linux distribution. Be aware that /proc is not easily available on Unix based systems, though (FreeBSD, OSX).
是的,它应该适用于任何 Linux 发行版。请注意, /proc 在基于 Unix 的系统上并不容易获得,但(FreeBSD、OSX)。
回答by sivabudh
Here's the solution that solved it for me:
这是为我解决的解决方案:
import os
import subprocess
import re
def findThisProcess( process_name ):
ps = subprocess.Popen("ps -eaf | grep "+process_name, shell=True, stdout=subprocess.PIPE)
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
return output
# This is the function you can use
def isThisRunning( process_name ):
output = findThisProcess( process_name )
if re.search('path/of/process'+process_name, output) is None:
return False
else:
return True
# Example of how to use
if isThisRunning('some_process') == False:
print("Not running")
else:
print("Running!")
I'm a Python + Linux newbie, so this might not be optimal. It solved my problem, and hopefully will help other people as well.
我是 Python + Linux 新手,所以这可能不是最佳选择。它解决了我的问题,希望也能帮助其他人。
回答by timblaktu
Seems to me a PID-based solution is too vulnerable. If the process you're trying to check the status of has been terminated, its PID can be reused by a new process. So, IMO ShaChris23 the Python + Linux newbie gave the best solution to the problem. Even it only works if the process in question is uniquely identifiable by its command string, or you are sure there would be only one running at a time.
在我看来,基于 PID 的解决方案太脆弱了。如果您尝试检查其状态的进程已终止,则其 PID 可以被新进程重用。所以,IMO ShaChris23 这个 Python + Linux 新手给出了这个问题的最佳解决方案。甚至它仅在相关进程可通过其命令字符串唯一识别时才有效,或者您确定一次只有一个进程在运行。
回答by Maksym Kozlenko
Sligtly modified version of ShaChris23 script. Checks if proc_name value is found within process args string (for example Python script executed with python ):
ShaChris23 脚本的轻微修改版本。检查是否在进程 args 字符串中找到 proc_name 值(例如使用 python 执行的 Python 脚本):
def process_exists(proc_name):
ps = subprocess.Popen("ps ax -o pid= -o args= ", shell=True, stdout=subprocess.PIPE)
ps_pid = ps.pid
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
for line in output.split("\n"):
res = re.findall("(\d+) (.*)", line)
if res:
pid = int(res[0][0])
if proc_name in res[0][1] and pid != os.getpid() and pid != ps_pid:
return True
return False
回答by mr.m
i had problems with the versions above (for example the function found also part of the string and such things...) so i wrote my own, modified version of Maksym Kozlenko's:
我在上面的版本中遇到了问题(例如,函数也发现了字符串的一部分等等......)所以我写了我自己的 Maksym Kozlenko 的修改版本:
#proc -> name/id of the process
#id = 1 -> search for pid
#id = 0 -> search for name (default)
def process_exists(proc, id = 0):
ps = subprocess.Popen("ps -A", shell=True, stdout=subprocess.PIPE)
ps_pid = ps.pid
output = ps.stdout.read()
ps.stdout.close()
ps.wait()
for line in output.split("\n"):
if line != "" and line != None:
fields = line.split()
pid = fields[0]
pname = fields[3]
if(id == 0):
if(pname == proc):
return True
else:
if(pid == proc):
return True
return False
I think it's more reliable, easier to read and you have the option to check for process ids or names.
我认为它更可靠、更易于阅读,并且您可以选择检查进程 ID 或名称。
回答by felbus
I use this to get the processes, and the count of the process of the specified name
我用它来获取进程,以及指定名称的进程数
import os
processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)
if proccount > 0:
print(proccount, ' processes running of ', processname, 'type')