2011-07-19 20 views
5

Mam prosty przykład:Twisted programu i terminu sygnał

 
    from twisted.internet import utils,reactor 

    def test: 
     utils.getProcessOutput(executable="/bin/sleep",args=["10000"]) 

    reactor.callWhenRunning(test) 
    reactor.run() 

kiedy wysłać sygnał „TERM” do programu „uśpienia” jest nadal prowadzone, kiedy nacisnąć Ctrl-C na klawiaturze „uśpienia "zatrzymanie się. (Ctrl-C nie jest równoważnym sygnałem TERM?) Dlaczego? Jak zabić "uśpienie" po wysłaniu sygnału "TERM" do tego programu?

Odpowiedz

4

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.

Powiązane problemy