Come si controlla in Linux con Python se un processo è ancora in esecuzione?[duplicare]

StackOverflow https://stackoverflow.com/questions/38056

  •  09-06-2019
  •  | 
  •  

Domanda

Questa domanda ha già una risposta qui:

L'unica Carino il modo che ho trovato è:

import sys
import os

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

(Fonte)
Ma è affidabile?Funziona con ogni processo e ogni distribuzione?

È stato utile?

Soluzione

La risposta di Mark è la strada da percorrere, dopo tutto, ecco perché è presente il file system /proc.Per qualcosa di un po' più copia/incollabile:

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

Altri suggerimenti

su Linux, puoi cercare nella directory /proc/$PID per ottenere informazioni su quel processo.Infatti, se la directory esiste, il processo è in esecuzione.

Dovrebbe funzionare su qualsiasi sistema POSIX (anche se guardando il /proc filesystem, come altri hanno suggerito, è più semplice se sai che sarà lì).

Tuttavia: os.kill potrebbe anche fallire se non si dispone dell'autorizzazione per segnalare il processo.Dovresti fare qualcosa del tipo:

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"

Ecco la soluzione che mi ha risolto:

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

Sono un principiante di Python + Linux, quindi potrebbe non essere ottimale.Ha risolto il mio problema e spero che possa aiutare anche altre persone.

// Ma è affidabile?Funziona con ogni processo e ogni distribuzione?

Sì, dovrebbe funzionare su qualsiasi distribuzione Linux.Tieni presente che /proc non è facilmente disponibile sui sistemi basati su Unix (FreeBSD, OSX).

Mi sembra che una soluzione basata su PID sia troppo vulnerabile.Se il processo di cui stai tentando di verificare lo stato è stato terminato, il suo PID può essere riutilizzato da un nuovo processo.Quindi, secondo me ShaChris23, il principiante di Python + Linux, ha fornito la migliore soluzione al problema.Anche se funziona solo se il processo in questione è identificabile in modo univoco dalla sua stringa di comando, o sei sicuro che ce ne sarà solo uno in esecuzione alla volta.

Lo uso per ottenere i processi e il conteggio del processo con il nome specificato

import os

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

if proccount > 0:
    print(proccount, ' processes running of ', processname, 'type')

Ho avuto problemi con le versioni sopra (ad esempio la funzione trovata anche parte della stringa e del genere ...) Quindi ho scritto la mia versione modificata di 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

Penso che sia più affidabile, più facile da leggere e hai la possibilità di verificare ID o nomi di processo.

Versione leggermente modificata dello script ShaChris23.Controlla se il valore proc_name viene trovato nella stringa degli argomenti del processo (ad esempio script Python eseguito con 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top