Como você verificar no Linux com o Python se um processo ainda está em execução?

votos
33

A única boa maneira que eu encontrei é:

import sys
import os

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

( Fonte )
Mas isso é confiável? Será que funciona com cada processo e cada distribuição?

Publicado 01/09/2008 em 16:20
fonte usuário
Em outras línguas...                            


9 respostas

votos
50

A resposta de Mark é o caminho a percorrer, afinal, é por isso que o sistema de arquivos / proc está lá. Para algo um pouco mais copy / pasteable:

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True
Respondeu 01/09/2008 em 19:06
fonte usuário

votos
27

No Linux, você pode olhar no diretório / proc / $ PID para obter informações sobre esse processo. Na verdade, se o diretório existir, o processo está sendo executado.

Respondeu 01/09/2008 em 16:50
fonte usuário

votos
11

Ele deve funcionar em qualquer sistema POSIX (embora olhando para o /procsistema de arquivos, como já foi sugerido, é mais fácil se você sabe que vai estar lá).

No entanto: os.killtambém pode falhar se você não tem permissão para sinalizar o processo. Você precisaria fazer algo como:

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"
Respondeu 01/09/2008 em 18:40
fonte usuário

votos
6

Aqui está a solução que resolveu isso por mim:

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

Eu sou um novato Python + Linux, então isso pode não ser o ideal. Ele resolveu o meu problema, e espero que vai ajudar outras pessoas também.

Respondeu 09/11/2010 em 22:49
fonte usuário

votos
6

// Mas isso é confiável? Será que funciona com cada processo e cada distribuição?

Sim, ele deve funcionar em qualquer distribuição Linux. Esteja ciente de que / proc não é facilmente disponível em sistemas baseados em Unix, embora (FreeBSD, OSX).

Respondeu 05/09/2008 em 12:02
fonte usuário

votos
5

Parece-me uma solução baseada em PID é muito vulnerável. Se o processo que você está tentando verificar o status de ter sido encerrado, seu PID pode ser reutilizado por um novo processo. Então, IMO ShaChris23 o novato Python + Linux deu a melhor solução para o problema. Mesmo ele só funciona se o processo em questão é exclusivamente identificável pela sua cadeia de comando, ou você é certeza de que haveria apenas uma corrida de cada vez.

Respondeu 25/02/2011 em 00:51
fonte usuário

votos
4

Eu uso isso para obter os processos, ea contagem do processo do nome especificado

import os

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

if proccount > 0:
    print(proccount, ' processes running of ', processname, 'type')
Respondeu 15/08/2013 em 19:54
fonte usuário

votos
3

Eu tive problemas com as versões anteriores (por exemplo, a função encontrada também parte da cadeia e essas coisas ...) Então eu escrevi a minha própria versão, modificada do Maksym Kozlenko de:

#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

Eu acho que é mais confiável, mais fácil de ler e você tem a opção de verificar a existência de IDs ou nomes de processo.

Respondeu 02/08/2012 em 21:05
fonte usuário

votos
0

versão do roteiro ShaChris23 sligtly modificado. Verifica se o valor proc_name é encontrado dentro de seqüência de processo args (por exemplo de script Python executado com 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
Respondeu 10/08/2011 em 10:31
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more