如果进程仍在运行,您如何在Linux中使用Python进行检查?

问题描述:

唯一不错我找到的方法是:如果进程仍在运行,您如何在Linux中使用Python进行检查?

import sys 
import os 

try: 
     os.kill(int(sys.argv[1]), 0) 
     print "Running" 
except: 
     print "Not running" 

Source
但是,这可靠吗?它是否适用于每个流程和每个分配?

+0

看到https://code.google.com/p/psutil/ – 2014-03-07 11:00:04

马克的回答是要走的路,毕竟,这就是为什么在/ 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" 

//但是这是可靠的吗?它是否适用于每个流程和每个分配?

是的,它应该适用于任何Linux发行版。请注意,尽管(FreeBSD,OSX),基于Unix的系统中/ proc并不容易获得。

下面是解决它,我的解决方案:我是一个Python + Linux新手

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!") 

,所以这可能不是最优的。它解决了我的问题,并希望能够帮助其他人。

+1

这将给出的例子当这个过程有多个孩子时会失败。 – 2011-05-01 13:38:32

对我来说,基于PID的解决方案似乎太脆弱了。如果您试图检查状态的进程已终止,则其PID可以被新进程重用。所以,国际海事组织ShaChris23 Python + Linux新手为这个问题提供了最好的解决方案。即使它只适用于有问题的进程可通过其命令字符串唯一标识,或者您确信一次只能运行一个进程。

+1

如果您正在运行某些版本的Linux,则唯一PID的数量为32768或/ proc/sys/kernel/pid_max中的任何内容,这使得重复使用的PID不太可能用于短期运行的程序。 – 2012-01-06 19:57:14

ShaChris23脚本的修改版本。检查是否proc_name中值处理ARGS字符串内找到(用于与蟒执行例如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 

我曾与上述版本(例如,功能也发现字符串,并这样的事情的一部分问题.. 。) 所以我写了我自己的,修改的马克西姆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')