Bir işlemin çalışmaya devam olmadığını nasıl Python ile Linux kontrol ederim?

oy
33

Sadece güzel buldum yoludur:

import sys
import os

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

( Kaynak )
Ama bu güvenilir mi? Her süreç ve her dağıtım ile çalışıyor mu?

Oluştur 01/09/2008 saat 16:20
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
27

linux üzerinde, bu süreçle ilgili bilgi almak için dizin / proc / $ PID'deki bakabilirsiniz. dizin varsa Aslında, süreç çalışıyor.

Cevap 01/09/2008 saat 16:50
kaynak kullanıcı

oy
11

Bu herhangi bir POSIX sisteminde çalışması gerekir (bakarak rağmen /proconun orada olacak biliyorsanız başkalarının önerdiğiniz gibi dosya sistemi, daha kolaydır).

Ancak: os.killİşlemi sinyal izni yoksa da başarısız olabilir. Sen böyle bir şey yapmak gerekir:

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"
Cevap 01/09/2008 saat 18:40
kaynak kullanıcı

oy
50

Mark'ın cevabı / proc dosya sistemi vardır neden tüm sonra, bu, gitmek yoludur. bir şey için biraz daha fazla kopyalama / pasteable:

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True
Cevap 01/09/2008 saat 19:06
kaynak kullanıcı

oy
6

// Ama bu güvenilir mi? Her süreç ve her dağıtım ile çalışıyor mu?

Evet, tüm Linux dağıtımları üzerinde çalışması gerekir. / Proc Unix tabanlı sistemler olsa (FreeBSD, OSX) üzerinde kolayca kullanılabilir olmadığını unutmayın.

Cevap 05/09/2008 saat 12:02
kaynak kullanıcı

oy
6

İşte benim için çözüldü çözüm:

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

Ben bir Python + Linux acemi değilim, bu yüzden bu optimum olmayabilir. Bu benim sorun çözüldü, ve bununla birlikte diğer insanlara yardımcı olacaktır.

Cevap 09/11/2010 saat 22:49
kaynak kullanıcı

oy
5

Bir PID tabanlı çözüm çok savunmasızdır Bana kalırsa. Eğer sonlandırıldı durumunu kontrol çalışıyorsanız süreç ise kendi PID yeni işlemiyle yeniden kullanılabilir. Yani, IMO Python + Linux acemi sorununa en iyi çözüm verdi ShaChris23. Hatta söz konusu süreç komut dize tarafından özel olarak teşhis ise sadece çalışır veya bir kerede yalnızca bir koşu olacağını eminiz.

Cevap 25/02/2011 saat 00:51
kaynak kullanıcı

oy
0

Sligtly ShaChris23 komut dosyasının sürümünü güncellenmiştir. Çekler proc_name değeri (python ile yürütülen örnek Python komut için) işlem args dize içinde bulunursa:

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
Cevap 10/08/2011 saat 10:31
kaynak kullanıcı

oy
3

i (... fonksiyonu da bulunan dize ve bu tür şeylerin parçası örneğin) yukarıdaki sürümleri ile ilgili sorunlar vardı bu yüzden Maksym Kozlenko en benim kendi modifiye versiyonunu yazdı:

#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

Bunun okumayı daha kolay, daha güvenilir olduğunu düşünüyorum ve işlem kimlikleri veya adlar kontrol etmek için seçeneğiniz vardır.

Cevap 02/08/2012 saat 21:05
kaynak kullanıcı

oy
4

Ben süreçlerini almak için bunu kullanabilir ve belirtilen ismin sürecinin sayımı

import os

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

if proccount > 0:
    print(proccount, ' processes running of ', processname, 'type')
Cevap 15/08/2013 saat 19:54
kaynak kullanıcı

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