我发现的唯一漂亮的方式是:
import sys
import os
try:
os.kill(int(sys.argv[1]), 0)
print "Running"
except:
print "Not running"
(Source)
但这可靠吗?它适用于每个流程和每个流程吗?
答案 0 :(得分:50)
Mark的答案是要走的路,毕竟这就是/ proc文件系统存在的原因。对于更多复制/粘贴的东西:
>>> import os.path
>>> os.path.exists("/proc/0")
False
>>> os.path.exists("/proc/12")
True
答案 1 :(得分:28)
答案 2 :(得分:12)
它应该适用于任何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"
答案 3 :(得分:7)
以下是为我解决的解决方案:
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新手,所以这可能不是最佳选择。它解决了我的问题,并希望能帮助其他人。
答案 4 :(得分:6)
//但这可靠吗?它适用于每个流程和每个流程吗?
是的,它应该适用于任何Linux发行版。请注意,在基于Unix的系统上,/ proc并不容易获得(FreeBSD,OSX)。
答案 5 :(得分:5)
对我来说,基于PID的解决方案太脆弱了。如果您尝试检查状态的进程已终止,则其PID可以由新进程重用。所以,IMO ShaChris23 Python + Linux新手给出了问题的最佳解决方案。即使只有当有问题的进程可以通过命令字符串唯一识别,或者您确定一次只能运行一个进程时,它才有效。
答案 6 :(得分:5)
我用它来获取进程,以及指定名称的进程计数
import os
processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)
if proccount > 0:
print(proccount, ' processes running of ', processname, 'type')
答案 7 :(得分:3)
我上面的版本有问题(例如,函数也发现了字符串的一部分和这样的东西......) 所以我写了我自己的修改版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或名称。
答案 8 :(得分:0)
ShaChris修改版ShaChris23脚本。检查是否在process 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