2015-05-22 2 views
1

среды: Raspberry Pi свистящихPopen не реагирует убить

У меня есть программа питона, которая использует POPEN вызвать другую Python программу

from subprocess import * 

oJob = Popen('sudo python mypgm.py',shell=True) 

Другой вариант меню должен закончить работу немедленно

oJob.kill() 

но работа все еще работает?

+0

В дополнение к (действительной/правильной) точке, сделанной другими, что 'shell = True' является злом, вы не можете убить работу, которой вы не являетесь, и' sudo' делает работу принадлежащей root, а не сам. –

+0

если сделать chgmod + x на моем python pgm, я получаю сообщение об ошибке о проводке. Pi требует sudo для использования wiringPiSetup. – Rod

+0

. Что вам нужно 'sudo', это не мешает вам сделать так, чтобы вы не смогли обработать такие процессы, как такие, I не знаю, что должен сделать ваш комментарий выше. Теперь вы можете 'sudo убить $ {pid}', для идентификатора процесса 'oJob', чтобы у вашего убийства были также повышенные привилегии, _or_ вы могли запускать всю программу под' sudo', тем самым уже имея повышенные привилегии для как запуск _and_ kill, тем самым избегая необходимости использовать 'sudo' снова. –

ответ

1

Вы должны добавить флаг создания агд

oJob = Popen('sudo python mypgm.py',shell=True, creationflags = subprocess.CREATE_NEW_PROCESS_GROUP) 

source

subprocess.CREATE_NEW_PROCESS_GROUP Popen creationflags параметр, чтобы указать, что новая группа процессов будет создана. Этот флаг необходим для использования os.kill() для подпроцесса.

EDIT Я согласен с замечанием о том, как импортировать материал и почему вы получаете что-то не определено. Кроме того, другой ответ, кажется, на правильном пути получения ИДПА

import subprocess as sub 

oJob = sub.Popen('sudo python mypgm.py', creationflags = sub.CREATE_NEW_PROCESS_GROUP) 
oJob.kill() 

Предупреждение Выполнения команд оболочки, которые включают unsanitized входных данных из ненадежного источника делает программу уязвимой для оболочки инъекций, серьезный недостаток безопасности, которая может привести к в произвольном исполнении команды. По этой причине использование shell=True настоятельно рекомендуется в тех случаях, когда командная строка строится из внешнего входа:

+0

Я использую «из импорта подпроцесса *», и он говорит, что подпроцесс не определен – Rod

+0

Затем вы уже импортировали CREATE_NEW_PROCESS_GROUP в глобальное пространство имен. Однако вы не должны использовать 'from subprocess import * 'в любом случае.Используйте либо 'import subprocess', либо укажите только те имена, которые вы хотите импортировать. Например, 'из подпроцесса импортировать Popen, CREATE_NEW_PROCESS_GROUP'. – chepner

+0

Будет ли это работать на малине pi Python версии – Rod

1

При добавлении опции shell=True, питон запускает оболочку и оболочка в свою очередь, запускает процесс python mymgm.py. Вы убиваете процесс оболочки здесь, который не убивает своего собственного ребенка, который запускает mymgm.py.

Для обеспечения того, чтобы дочерний процесс был убит на oJob.kill, вам необходимо сгруппировать их в одну группу процессов и сделать командный процесс лидером группы. Кода,

import os 
import signal 
import subprocess 

# The os.setsid() is passed in the argument preexec_fn so 
# it's run after the fork() and before exec() to run the shell. 
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
         shell=True, preexec_fn=os.setsid) 

os.killpg(pro.pid, signal.SIGTERM) # Send the signal to all the process groups 

При отправке SIGTERM сигнала процесса оболочки, он убьет всех его дочерние процессы, а также.

+0

Может быть, правда, может и нет. Некоторые оболочки автоматически выполняют последнюю команду в строке, с которой они связаны. –

Смежные вопросы