python forward SIGINT для подпроцесса - PullRequest
2 голосов
/ 28 сентября 2019

Вот простой скрипт Python, который порождает процесс:

import subprocess
import os

subprocess.run(['ping', '-i', '30', 'google.fr'],
               preexec_fn=lambda : os.setpgrp())

Когда я kill -TERM <python-pid>, он останавливает процесс python, но процесс ping продолжает работать: это то, чем я быложидая.

Но когда я kill -INT <python-pid>, процессы python и ping останавливаются.Это отличается от CTRL-V, который отправляет SIGINT группе процессов, а не только процессу.В любом случае, setpgrp делает процесс ping лидером своей собственной группы процессов.

Так что я предполагаю, что где-то в коде Python, SIGINT отправляется от ping потомка, но SIGTERM нет, но где этот код и где он задокументирован?

Редактировать : я использую Python 3.6 в Debian 9.

1 Ответ

2 голосов
/ 28 сентября 2019

Код в subprocess.run, функция, которую вы вызвали.SIGINT преобразуется в исключение KeyboardInterrupt, которое обрабатывается предложением except, которое вызывает process.kill().Вы можете реализовать различную обработку SIGINT, используя модуль signal.Примечательно, что kill не отправляет SIGINT, а отправляет SIGKILL, поэтому подпроцесс не получает возможности выполнить аналогичную обработку с этой очисткой по умолчанию.

...