2014-12-19 12 views
5

Ich habe versucht, herauszufinden, wie viel Zeit zu einer Anwendung gegeben wird, um beim Empfang eines SIGTERM zu beenden, bevor es ein SIGKILL gesendet wird?Wie viel Zeit vor SIGKILL

Mein Wissen über dieses Signal ist sehr gering. Ich habe einiges in den vorgeschlagenen Antworten auf Stackoverflow gelesen, aber ich kann nicht "ungefähr" sehen, wie viel Zeit ein Prozess leben kann, bevor er SIGTERminated wird.

EDIT: Lassen Sie uns zum Beispiel sagen, dass ich ein Problem erstellen, die absichtlich blockiert die OS heruntergefahren

Ich bin für Antwort für einen Prozess ohne MMI suchen, auf eine (vielleicht ein while(1) könnte es tun?) Standard-Linux-Distribution, sagen wir ein Ubuntu mit einem Kernel 3.x.

Meine Vermutung ist, dass es keine Wartezeit gibt. Wenn der Prozess verschwindet, gibt das System ihm Zeit, seine Ressourcen freizugeben. Andernfalls tötet das System es.

+3

Gibt es einen bestimmten Kontext, in dem Sie diese Frage stellen, z. B. Signale, die beim Herunterfahren an Prozesse gesendet werden? Wenn nicht, wird nach einem TERM nicht unbedingt ein KILL gesendet. Ein Prozess kann TERM empfangen, ignoriert und ohne Probleme ausgeführt werden. – cobbal

+0

Haben Sie versucht 'Zeit' Befehl zum Überprüfen' Kill' ​​Befehl – Skynet

+0

@cobbal: Ich habe Probleme, ein Beispiel zu finden. Angenommen, meine Programme blockieren das Betriebssystem oder kümmern sich nicht um SIGKILL-Signale. Ist es in diesem Zusammenhang relevanter?Manchmal kann MMI das Betriebssystem mit dem "Nicht reagieren" in Windows zum Beispiel blockieren. Ich suche einen ähnlichen Fall ohne MMI unter Linux. – xhaltar

Antwort

7

die zum Beispiel sagen lassen, dass ich ein Problem, dass absichtlich blockiert das Betriebssystem heruntergefahren erstellen (vielleicht ein while (1) könnte es tun?)

Nope. Es wird nicht funktionieren. Ein Prozess kann einige Signale wie SIGKILL und SIGSTOP mit Ausnahme von init nicht ignorieren.
Im Allgemeinen Sie können SIGKILL unmittelbar nach SIGTERM senden: Es gibt keine Standard-Verzögerung beendet die Anwendung zu lassen. Es ist jedoch sinnvoll, solchen Anwendungen die Möglichkeit zu geben, sich selbst zu schließen, bevor der Kernel das ohne weitere Benachrichtigungen tut.
Weitere Informationen here.

Was das System Shutdown-Vorgang betrifft, ist ein wenig anders. In der Tat ist es das System init, das entscheidet, wie und wann Maßnahmen ergriffen werden; Das Betriebssystem hilft dem Init-Daemon bei dieser Operation aber indirekt (Signale liefern, Ressourcen bereinigen usw.).
So dreht es sich zur Umsetzung abhängig werden. Analysiert Systemd-217, scheint es nach dem Senden von SIGTERM 10 Sekunden zu warten.

Von src/core/shutdown.c in main

log_info("Sending SIGTERM to remaining processes..."); 
    broadcast_signal(SIGTERM, true, true); 

    log_info("Sending SIGKILL to remaining processes..."); 
    broadcast_signal(SIGKILL, true, false); 

Von src/core/killall.c in broadcast_signal

killall(sig, pids, send_sighup); 
[...] 
if (wait_for_exit) 
      wait_for_children(pids, &mask); 

Continuing, in wait_for_children

until = now(CLOCK_MONOTONIC) + TIMEOUT_USEC; 
[...] 
k = sigtimedwait(mask, NULL, &ts); 
       if (k != SIGCHLD) 

wo TIMEOUT_USER ist #define TIMEOUT_USEC (10 * USEC_PER_SEC)

Wie Sie sehen können, wartet systemd auf SIGCHLD, was anzeigen würde, dass das Kind beendet wurde, da die meisten der laufenden Prozesse Systemd-Kinder sind.