2016-03-20 3 views
0

Я пытаюсь написать простой сервер python, который запускает и убивает другой скрипт python. Проблема заключается в том, что команда kill выдается без ошибок, но не убивает процесс. Я попытался вручную с «kill -INT pid» без каких-либо результатов.Выдача kill через подпроцесс

Команда работает в оболочке, но не на питоне. Я выполняю «мягкое» убийство, потому что скрипт управляет светом, а «kill -9» не выключает свет.

Примечание: скрипт работает на Yocto-помесщения

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() 

Выход 'убить -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

Вы должны проверить исходный вывод 'ps', чтобы убедиться, что он фактически перечисляет запрошенный процесс и использует [' os.kill'] (https://docs.python.org/2/library/os .html # os.kill), чтобы завершить процесс, а не порождать другой процесс. – Petesh

ответ

1

Рассмотрим os.kill как предложено @Petesh так что ваш код будет выглядеть примерно так:

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' 

Также необходимо учитывать следующее для извлечения 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) 
Смежные вопросы