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

时间:2008-09-01 15:20:52

标签: python linux unix process

我发现的唯一漂亮的方式是:

import sys
import os

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

Source
但这可靠吗?它适用于每个流程和每个流程吗?

9 个答案:

答案 0 :(得分:50)

Mark的答案是要走的路,毕竟这就是/ proc文件系统存在的原因。对于更多复制/粘贴的东西:

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True

答案 1 :(得分:28)

在Linux上,您可以查看目录/ proc / $ PID以获取有关该进程的信息。实际上,如果目录存在,则进程正在运行。

答案 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