Интересно, возможно ли отключить канал связи при уничтожении подпроцесса, запущенного в другом потоке. Если я не вызову connect (), то kill () будет работать как положено, завершив процесс через одну секунду вместо пяти.
Я нашел обсуждение подобной проблемы здесь , но я не получил реальных ответов. Я предполагаю, что я либо должен быть в состоянии закрыть канал, либо явно уничтожить подпроцесс (который в этом примере называется "сон") и уничтожить его, чтобы разблокировать канал.
Я также пытался найти ответ на нее на SO, но я нашел только this и this и this , которые напрямую не решают эту проблему как насколько я могу судить (?).
Итак, что я хочу сделать, так это уметь запускать команду во втором потоке и получать весь ее вывод, но иметь возможность немедленно убить ее, когда захочу. Я мог бы пройтись по файлу и отследить его или подобное, но я думаю, что должен быть лучший способ сделать это?
import subprocess, time
from threading import Thread
process = None
def executeCommand(command, runCommand):
Thread(target=runCommand, args=(command,)).start()
def runCommand(command):
global process
args = command.strip().split()
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
for line in process.communicate():
if line:
print "process:", line,
if __name__ == '__main__':
executeCommand("./ascript.sh", runCommand)
time.sleep(1)
process.kill()
Это скрипт:
#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"
выход
$ time python poc.py
process: sleeping five
real 0m5.053s
user 0m0.044s
sys 0m0.000s