Ctrl-C wysyła SIGINT do całej grupy procesów pierwszego planu. Oznacza to, że zostanie on wysłany do twego programu Twisted i do procesu potomnego podczas snu.
Jeśli chcesz zabić proces snu, gdy proces Python ma zamiar wyjść, to może chcesz przed zamknięciem wyzwalania:
def killSleep():
# Do it, somehow
reactor.addSystemEventTrigger('before', 'shutdown', killSleep)
Jako Twój przykład kod jest napisane, killSleep
trudno wprowadzić w życie. getProcessOutput
nie daje ci czegoś, co pozwala łatwo zabić dziecko (na przykład, nie znasz jego pid). Jeśli użyjesz reactor.spawnProcess
i niestandardowego ProcessProtocol
, problem ten zostanie rozwiązany - ProcessProtocol
zostanie podłączony do transportu procesowego, który ma metodę signalProcess
, której możesz użyć do wysłania SIGTERM (lub cokolwiek chcesz) do procesu potomnego.
Można również ignorować SIGINT i ten punkt, a następnie ręcznie dostarczyć go do całej grupy procesów:
import os, signal
def killGroup():
signal.signal(signal.SIGINT, signal.SIG_IGN)
os.kill(-os.getpgid(os.getpid()), signal.SIGINT)
reactor.addSystemEventTrigger('before', 'shutdown', killGroup)
Ignoruj SIGINT ponieważ proces Twisted już zamknięcie i inny sygnał nie będzie nic dobrego (i prawdopodobnie pomyli to lub przynajmniej doprowadzi do zgłoszenia fałszywych błędów). Przesłanie sygnału do -os.getpgid(os.getpid())
dotyczy sposobu wysłania go do całej grupy procesów.