2013-07-25 17 views
22

Próbuję napisać krótki skrypt w pythonie, który uruchomi inny kod Pythona w podprocesie, jeśli nie jest jeszcze uruchomiony, inaczej zakończ terminal & aplikacji (Linux).Jak zakończyć proces z Python za pomocą pid?

Tak to wygląda:

#!/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) 

Masz problem braku wiedzy, aby wymienić przeróbki przez PID która aplikacja odczytuje z pliku ".proc". Innym problemem jest to, że interpreter mówi, że ciąg o nazwie dat nie jest równy "x" ??? Co przegapiłem?

+2

Dlaczego przekazujesz 'shell = True'? AFAIK nie jest potrzebny w twoim przypadku użycia. Zauważ również, że przy użyciu 'shell = True' pid zwrócony przez' p.pid' jest * nie * pid procesu Pythona, ale pid powłoki spawned do wykonania tego procesu. – Bakuriu

+0

+1 za komentarz, ale uważam to za stosowne, ponieważ muszę również zamknąć terminal. – Alex

Odpowiedz

52

Korzystanie niesamowite psutil biblioteki jest całkiem prosta:

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

Jeśli nie chcesz zainstalować nową bibliotekę, można użyć modułu os:

import os 
import signal 

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

Jeśli jesteś zainteresowany uruchomieniem polecenia python StripCore.py, jeśli nie jest uruchomiony, i zabicie go w inny sposób, możesz użyć psutil, aby wykonać to polecenie ly.

Coś jak:

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']) 

run Próbka:

$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. 

Uwaga: W poprzednich wersjach cmdlinepsutil był atrybutem zamiast metody.

+0

Dzięki, ale głównym problemem dla mnie jest jak uzyskać pid uruchomionej aplikacji? – Alex

+3

@Alex Co masz na myśli? Czy chcesz zakończyć proces, który jest wykonywany? Następnie użyj po prostu 'sys.exit()'. Jeśli chcesz uzyskać dostęp do 'pid' bieżącego procesu, użyj' os.getpid() '. – Bakuriu

+0

at_Bakuriu przepraszam proszę (mi dispiace). Chcę zrobić skrypt, który uruchomi jakąś aplikację, jeśli nie jest uruchomiony. A jeśli aplikacja jest uruchomiona, aby zakończyć tę aplikację, a także siebie. – Alex

2

Chciałem zrobić to samo, ale chciałem zrobić to w jednym pliku.

Więc logiczne byłoby:

  • jeśli skrypt z moim imieniu działa, zabić go, a następnie wyjść
  • jeśli skrypt z moim nazwiskiem nie jest uruchomiony, robić rzeczy

i zmodyfikowana odpowiedź przez Bakuriu i podszedł z tym:

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... 

Uruchamianie skryptu zrobi cokolwiek skrypt działa. Uruchomienie kolejnej instancji skryptu zabije istniejącą instancję skryptu.

Używam tego do wyświetlania małego widżetu kalendarza PyGTK, który uruchamia się po kliknięciu zegara. Jeśli kliknę, a kalendarz nie będzie wyświetlany, zostanie wyświetlony kalendarz. Jeśli kalendarz jest uruchomiony i klikam zegar, kalendarz znika.

Powiązane problemy