2013-07-25 20 views
22

Python'da kısa bir betik yazmaya çalışıyorum, eğer daha önce başka bir python kodu basmayacaksa, başka bir şekilde terminal & uygulamasını (Linux) sonlandırmaya başlamıyor.Python'dan pid kullanarak işlem nasıl sonlandırılır?

#!/usr/bin/python 
from subprocess import Popen 

text_file = open(".proc", "rb") 
dat = text_file.read() 
text_file.close() 

def do(dat): 

    text_file = open(".proc", "w") 
    p = None 

    if dat == "x" : 

     p = Popen('python StripCore.py', shell=True) 
     text_file.write(str(p.pid)) 

    else : 
     text_file.write("x") 

     p = # Assign process by pid/pid from int(dat) 
     p.terminate() 

    text_file.close() 

do(dat) 

uygulama dosyası ".proc" okur pid ile adı işlenme için bilgiyi eksik sorununu var: gibi

Yani görünüyor. Diğer problem, yorumlayıcı dat isimli dizenin "x" ??? Neyi özledim? müthiş psutil kütüphaneyi kullanma

+2

Niçin 'shell = True' kullanıyorsunuz? AFAIK kullanım durumunuzda gerekli değildir. Ayrıca, 'shell = True' kullanıldığında, p.pid 'tarafından döndürülen pid'in python işleminin pid'i değil, bu işlemi yürütmek için oluşturulan pidenin pid değeri olduğunu unutmayın.Yorumunuz için – Bakuriu

+0

+1, ancak bunu uygun buluyorum çünkü terminali de kapatmam gerekiyor. – Alex

cevap

52

oldukça basit:

import os 
import signal 

os.kill(pid, signal.SIGTERM) #or signal.SIGKILL 

varsa: Yeni kütüphane kurmak istemiyorsanız

p = psutil.Process(pid) 
p.terminate() #or p.kill() 

, sen os modülünü kullanabilirsiniz Çalışmıyorsa python StripCore.py komutunu başlatmakla ilgileniyorsunuz ve aksi halde psutil numaralı telefonu kullanabilirsiniz. ly. gibi

şey:

import psutil 
from subprocess import Popen 

for process in psutil.process_iter(): 
    if process.cmdline() == ['python', 'StripCore.py']: 
     print('Process found. Terminating it.') 
     process.terminate() 
     break 
else: 
    print('Process not found: starting it.') 
    Popen(['python', 'StripCore.py']) 

Numune çalışma:

$python test_strip.py #test_strip.py contains the code above 
Process not found: starting it. 
$python test_strip.py 
Process found. Terminating it. 
$python test_strip.py 
Process not found: starting it. 
$killall python 
$python test_strip.py 
Process not found: starting it. 
$python test_strip.py 
Process found. Terminating it. 
$python test_strip.py 
Process not found: starting it. 

Not: Önceki psutil sürümlerinde cmdline yılında bir nitelik yerine bir yöntemdir oldu.

+0

Teşekkürler, ama benim için esas sorun, çalışan uygulama pidini nasıl elde edeceğinizdir? – Alex

+3

@Alex Ne demek istiyorsun? Yürütmekte olan işlemi sonlandırmak ister misiniz? Sonra sadece 'sys.exit()' kullanın. Mevcut işlemin 'pid'ine erişmek istiyorsanız os.getpid()' işlevini kullanın. – Bakuriu

+0

at_Bakuriu afedersiniz lütfen (mi dispiace). Sadece başlatılmamışsa bazı uygulamaları çalıştıracak betik yapmak istiyorum. Ve uygulama başlatılırsa, bu uygulamayı ve kendini de sonlandırmak için. – Alex

2

Aynı şeyi yapmak istedim, ancak tek bir dosyada yapmak istedim.

Yani mantık olacaktır: ismimi bir komut dosyası çalışıyorsa

  • , ismimi bir komut çalışmıyorsa, o zaman
  • çıkmak, öldürün, do şeyler

Ben Bakuriu tarafından cevap modifiye ve bu geldi: yapacağız senaryoyu Running

from os import getpid 
from sys import argv, exit 
import psutil ## pip install psutil 

myname = argv[0] 
mypid = getpid() 
for process in psutil.process_iter(): 
    if process.pid != mypid: 
     for path in process.cmdline(): 
      if myname in path: 
       print "process found" 
       process.terminate() 
       exit() 

## your program starts here... 

ne olursa olsun betik yapar. Komut dosyasının başka bir örneğini çalıştırmak, komut dosyasının mevcut tüm örneklerini öldürür.

Bunu, saati tıklattığımda çalışan küçük bir PyGTK takvim widget'ını görüntülemek için kullanıyorum. Tıklarsam takvim kapanmazsa takvim görüntülenir. Takvim çalışıyorsa ve saati tıklatırsam, takvim kaybolur.

İlgili konular