2016-03-20 7 views
0

Ich versuche, einen einfachen Python-Server zu schreiben, der ein anderes Python-Skript ausführt und beendet. Das Problem, das ich habe, ist, dass der Befehl kill ohne Fehler ausgegeben wird, aber den Prozess nicht abbricht. Ich habe manuell mit 'kill -INT pid' ohne Ergebnis versucht.Auslösen von Kill durch Subprozess

Der Befehl funktioniert in der Shell, aber nicht in Python. Ich mache einen "sanften" Kill, weil das Skript ein Licht steuert und ein "Kill -9" das Licht nicht ausschaltet.

ANMERKUNG: das Skript läuft auf yocto-distr

import socket, subprocess 

srv = socket.socket() 
srv.bind(('', 1340)) 
srv.listen(3) 
while 1: 
    connection, address = srv.accept() 
    data = int(connection.recv(1024)) 
    if data == 0: 
     ps_id = subprocess.check_output('ps|grep python\ /home/root/python/backlight_mod.py', shell=True) 
     ps_id = ps_id.split(' ')[2] 
     subprocess.call('kill -INT ' + str(ps_id), shell=True) 
     print 'Terminated' 
    elif data == 1: 
     subprocess.call('python ~/python/backlight_mod.py &', shell=True) 
    connection.close() 

Die Ausgabe von 'töten -l':

HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS RTMIN RTMIN+1 RTMIN+2 RTMIN+3 RTMIN+4 RTMIN+5 RTMIN+6 RTMIN+7 RTMIN+8 RTMIN+9 RTMIN+10 RTMIN+11 RTMIN+12 RTMIN+13 RTMIN+14 RTMIN+15 RTMAX-14 RTMAX-13 RTMAX-12 RTMAX-11 RTMAX-10 RTMAX-9 RTMAX-8 RTMAX-7 RTMAX-6 RTMAX-5 RTMAX-4 RTMAX-3 RTMAX-2 RTMAX-1 RTMAX 
+0

Sie sollten die rohe Ausgabe von 'ps' überprüfen, um sicherzustellen, dass es den angeforderten Prozess tatsächlich auflistet, und verwenden Sie [' os.kill'] (https://docs.python.org/2/library/os .html # os.kill), um den Prozess zu beenden, anstatt einen anderen Prozess zu generieren. – Petesh

Antwort

1

os.kill Betrachten wir, wie durch @Petesh vorgeschlagen, damit Ihr Code würde in etwa so aussehen:

if data == 0: 
    ps_id = subprocess.check_output('ps|grep python\ /home/root/python/backlight_mod.py', shell=True) 
    ps_id = ps_id.split(' ')[2] 
    os.kill(pid, 3) 
    print 'Terminated' 

sehen Sie sich auch die folgenden pid zu extrahieren:

p = subprocess.Popen(['ps', '-A'], stdout = subprocess.PIPE) 
out, err = p.communicate() 

for process in out.splitlines(): 
    if 'backlight_mod.py' in process: 
    pid = int(process.split(None, 1)[0]) 
    os.kill(pid, 3)