При добавлении опции 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
сигнала процесса оболочки, он убьет всех его дочерние процессы, а также.
В дополнение к (действительной/правильной) точке, сделанной другими, что 'shell = True' является злом, вы не можете убить работу, которой вы не являетесь, и' sudo' делает работу принадлежащей root, а не сам. –
если сделать chgmod + x на моем python pgm, я получаю сообщение об ошибке о проводке. Pi требует sudo для использования wiringPiSetup. – Rod
. Что вам нужно 'sudo', это не мешает вам сделать так, чтобы вы не смогли обработать такие процессы, как такие, I не знаю, что должен сделать ваш комментарий выше. Теперь вы можете 'sudo убить $ {pid}', для идентификатора процесса 'oJob', чтобы у вашего убийства были также повышенные привилегии, _or_ вы могли запускать всю программу под' sudo', тем самым уже имея повышенные привилегии для как запуск _and_ kill, тем самым избегая необходимости использовать 'sudo' снова. –