Hvordan du sjekker inn Linux gjør med Python hvis en prosess fortsatt kjører?

stemmer
33

Den eneste fine måten jeg har funnet er:

import sys
import os

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

( Kilde )
Men dette er pålitelig? Fungerer det med hver prosess og hvert distribusjon?

Publisert på 01/09/2008 klokken 15:20
kilden bruker
På andre språk...                            


9 svar

stemmer
50

Mark svar er veien å gå, tross alt, det er derfor / proc filsystemet er der. For noe litt mer copy / pasteable:

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True
Svarte 01/09/2008 kl. 18:06
kilden bruker

stemmer
28

på linux, kan du se i katalogen / proc / $ PID for å få informasjon om denne prosessen. Faktisk, hvis katalogen eksisterer, er prosessen i gang.

Svarte 01/09/2008 kl. 15:50
kilden bruker

stemmer
11

Det skal fungere på alle POSIX system (selv ser på /procfilsystemet, som andre har foreslått, er lettere hvis du vet at det kommer til å være der).

Men: os.killkan også mislykkes hvis du ikke har tillatelse til å signalisere prosessen. Du trenger å gjøre noe sånt som:

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"
Svarte 01/09/2008 kl. 17:40
kilden bruker

stemmer
6

Her er løsningen som løste det for meg:

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

Jeg er en Python + Linux nybegynner, så dette kan ikke være optimal. Det løste problemet mitt, og forhåpentligvis vil hjelpe andre mennesker også.

Svarte 09/11/2010 kl. 21:49
kilden bruker

stemmer
6

// Men dette er pålitelig? Fungerer det med hver prosess og hvert distribusjon?

Ja, det skal fungere på alle Linux-distribusjon. Vær oppmerksom på at / proc er ikke lett tilgjengelig på Unix-baserte systemer, selv om (FreeBSD, OSX).

Svarte 05/09/2008 kl. 11:02
kilden bruker

stemmer
5

Synes for meg en PID-basert løsning er også sårbar. Hvis prosessen du prøver å sjekke status på er avsluttet, kan dens PID gjenbrukes av en ny prosess. Så, IMO ShaChris23 Python + Linux newbie ga den beste løsningen på problemet. Selv det fungerer bare hvis prosessen i spørsmålet er unikt identifiserbar ved sin kommandostrengen, eller du er sikker på at det ville være bare en kjører på en gang.

Svarte 24/02/2011 kl. 23:51
kilden bruker

stemmer
4

Jeg bruker dette for å få prosessene, og tellingen av prosessen med det angitte navnet

import os

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

if proccount > 0:
    print(proccount, ' processes running of ', processname, 'type')
Svarte 15/08/2013 kl. 18:54
kilden bruker

stemmer
3

Jeg hadde problemer med versjonene over (for eksempel funksjonen finnes også en del av strengen og slike ting ...) så jeg skrev min egen, modifisert versjon av Maksym Kozlenko tallet:

#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

Jeg tror det er mer pålitelig, lettere å lese, og du har muligheten til å sjekke for prosess IDer eller navn.

Svarte 02/08/2012 kl. 20:05
kilden bruker

stemmer
0

Sligtly modifisert versjon av ShaChris23 script. Kontrollerer om proc_name verdien er innenfor prosess argumentstrengen (for eksempel Python skriptet utført med 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
Svarte 10/08/2011 kl. 09:31
kilden bruker

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