2016-03-20 1 views
0

J'essaye d'écrire un serveur python simple qui s'exécute et tue un autre script python. Le problème que j'ai est que la commande kill est émise sans erreur mais ne tue pas le processus. J'ai essayé manuellement avec 'kill -INT pid' sans aucun résultat.Emission de kill via le sous-processus

La commande fonctionne en shell mais pas en python. Je fais un 'soft' kill car le script contrôle une lumière et un 'kill -9' n'éteint pas la lumière.

REMARQUE: le script est en cours d'exécution sur 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() 

La sortie de 'kill -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

Vous devez vérifier la sortie brute de 'ps' pour vous assurer qu'elle répertorie réellement le processus demandé et utiliser [' os.kill'] (https://docs.python.org/2/library/os .html # os.kill) pour terminer le processus plutôt que d'engendrer un autre processus. – Petesh

Répondre

1

Tenir compte os.kill comme suggéré par @Petesh pour que votre code renverrait ressembler à quelque chose comme ceci:

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' 

Voir également les éléments suivants pour extraire pid:

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)