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

时间:2020-03-05 18:46:01  来源:igfitidea点击:

我发现的唯一好方法是:

import sys
import os

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

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

解决方案

回答

在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"

回答

毕竟,Mark的答案就是解决之道,这就是/ proc文件系统在那里的原因。对于一些复制/粘贴的东西:

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

回答

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

是的,它可以在任何Linux发行版上使用。注意/ proc在基于Unix的系统上不容易使用(FreeBSD,OSX)。

回答

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

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