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