38

我发现的唯一好方法是:

import sys
import os

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

来源
但这可靠吗?它适用于每个流程和每个发行版吗?

4

9 回答 9

55

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

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True
于 2008-09-01T18:06:42.690 回答
29

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

于 2008-09-01T15:50:56.243 回答
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"
于 2008-09-01T17:40:47.417 回答
9

这是为我解决它的解决方案:

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 新手,所以这可能不是最佳选择。它解决了我的问题,希望也能帮助其他人。

于 2010-11-09T21:49:08.413 回答
9

我用它来获取进程,以及指定名称的进程的计数

import os

processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)

if proccount > 0:
    print(proccount, ' processes running of ', processname, 'type')
于 2013-08-15T18:54:32.607 回答
6

但这可靠吗?它适用于每个流程和每个发行版吗?

是的,它应该适用于任何 Linux 发行版。请注意,/proc 在基于 Unix 的系统上并不容易使用(FreeBSD、OSX)。

于 2008-09-05T11:02:11.927 回答
5

在我看来,基于 PID 的解决方案太脆弱了。如果您尝试检查其状态的进程已终止,则其 PID 可以被新进程重用。因此,Python + Linux 新手 IMO ShaChris23 给出了该问题的最佳解决方案。即使它仅在所讨论的进程可以通过其命令字符串唯一标识的情况下才有效,或者您确定一次只会运行一个。

于 2011-02-24T23:51:09.967 回答
4

我在上面的版本中遇到了问题(例如,该函数也发现了字符串的一部分等等......)所以我编写了我自己的修改版本的 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 或名称。

于 2012-08-02T20:05:52.587 回答
0

ShaChris23 脚本的 Sligtly 修改版本。检查是否在进程 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
于 2011-08-10T09:31:19.213 回答