2012-02-23 3 views
0

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

Проблема в том, что я хочу запустить этот скрипт как демон, а затем завершить его с помощью какого-то сигнала 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) 
+0

Как вы отправили сигнал INT? 'kill -s SIGINT pid' из оболочки? –

+0

Да, именно так я послал сигнал. Результат был другим по сравнению с использованием Ctrl-C – Rok

ответ

6

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

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

Или, более прямолинейно, Popen.terminate?

+0

Когда я запускаю popen (comamand, shell = True), он сначала запускает процесс оболочки, а дочерний выполняет команду. Когда я выполняю .terminate(), дочерний процесс продолжает работать. – Rok

+0

@Rok, нужно ли использовать 'shell = True'? В любом случае, отправьте вызов «Popen», который вы используете. – senderle

+0

Было бы полезно использовать shell = True, так как я не хочу обрабатывать стандартный вывод внутри моего скрипта. – Rok

0

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