Имитация Ctrl-C для сценария Python - PullRequest
1 голос
/ 23 февраля 2012

У меня есть скрипт на python, который ждет некоторых заданий и выполняет их в потоках (используя subprocess.Popen с shell=True).Когда я запускаю скрипт в оболочке и пытаюсь завершить его с помощью Ctrl-C, он нормально и чисто закрывается.

Проблема в том, что я хочу запустить этот скрипт как демон, а затем завершить его, используя какой-то видUnix сигнал.Сигнал INT должен совпадать с сигналом Ctrl-C, но он не работает таким же образом.Это оставляет дочерние процессы subproces.popen запущенными.

Я также пытался поднять KeyboardInterupt в главном потоке, когда получаю сигнал, но также не удается закрыть сценарий и завершить все дочерние процессы.

Любые предложения по эмуляции Ctrl-C?

Пример вызова subprocess.popen:

shell_cmd = "bwa aln -t 8 file1.fasta file1.fastq.gz > file1.sam.sai"
process = subprocess.Popen(shell_cmd,
                           shell=True,
                           stderr=subprocess.PIPE)

Ответы [ 2 ]

6 голосов
/ 23 февраля 2012

Повышение KeyboardInterrupt в основном процессе Повышение KeyboardInterrupt в основном процессе. Вы должны отправить сигнал подпроцессам.

Вы пробовали Popen.send_signal?

Или, еще проще, Popen.terminate?

1 голос
/ 15 декабря 2013

Ctrl-C отправляет SIGINT всей группе процессов, а не только одному процессу . Используйте os.killpg() или отрицательный идентификатор процесса с kill для отправки SIGINT в группу процессов.

...