如何在Linux上使用Python检查进程是否仍在运行?
我找到的唯一好办法是:如何在Linux上使用Python检查进程是否仍在运行?,python,linux,unix,process,Python,Linux,Unix,Process,我找到的唯一好办法是: import sys import os try: os.kill(int(sys.argv[1]), 0) print "Running" except: print "Not running" () 但这可靠吗?它是否适用于每个进程和每个发行版?在linux上,您可以查看目录/proc/$PID以获取有关该进程的信息。事实上,如果目录存在,进程正在运行。它应该可以在任何POSIX系统上工作(尽管正如其他人所建议的那样
import sys
import os
try:
os.kill(int(sys.argv[1]), 0)
print "Running"
except:
print "Not running"
()但这可靠吗?它是否适用于每个进程和每个发行版?在linux上,您可以查看目录/proc/$PID以获取有关该进程的信息。事实上,如果目录存在,进程正在运行。它应该可以在任何POSIX系统上工作(尽管正如其他人所建议的那样,查看
/proc
文件系统更容易,如果您知道它将在那里)
但是: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"
Mark的答案是正确的,毕竟,这就是/proc文件系统存在的原因。对于更易于复制/粘贴的内容:
>>> import os.path
>>> os.path.exists("/proc/0")
False
>>> os.path.exists("/proc/12")
True
但这可靠吗?它是否适用于每个流程和每个分发
是的,它应该适用于任何Linux发行版。但是,请注意/proc在基于Unix的系统(FreeBSD、OSX)上不容易使用。以下是解决此问题的解决方案:
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!")
我是Python+Linux新手,所以这可能不是最佳选择。它解决了我的问题,希望也能帮助其他人。在我看来,基于PID的解决方案太脆弱了。如果您试图检查其状态的进程已终止,则新进程可以重用其PID。因此,Python+Linux新手IMO ShaChris23为这个问题提供了最好的解决方案。即使只有当所讨论的进程可以通过其命令字符串唯一地识别时,或者您确信一次只能运行一个进程时,它也可以工作。ShaChris23脚本的略微修改版本。检查是否在进程args字符串中找到proc_name值(例如,使用Python执行的Python脚本):
我在上面的版本中遇到了问题(例如,函数也找到了字符串的一部分等等…) 所以我写了我自己的修改版的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
我认为它更可靠,更易于阅读,并且您可以选择检查进程ID或名称。我使用它来获取进程,以及指定名称的进程计数
import os
processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)
if proccount > 0:
print(proccount, ' processes running of ', processname, 'type')
当进程有多个子进程时,这会失败很多。如果运行某些版本的Linux,唯一pid的数量是32768或/proc/sys/kernel/pid_max中的任何内容,这使得短时间运行的程序不太可能重复使用pid。请参阅Nice中给出的示例,请注意,这将计算失效的进程,您应该如何计算该数字?我不明白
import os
processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)
if proccount > 0:
print(proccount, ' processes running of ', processname, 'type')