SIGSTOP
i SIGKILL
są dwoma sygnałami, których proces nie może uchwycić i przetworzyć. SIGTSTP
przypomina SIGSTOP
to, że można go złapać i obsłużyć.
SIGSTOP
I SIGTSTP
sygnały zatrzymania procesu w jego utworów, gotowy SIGCONT
. Gdy wyślesz ten proces a SIGTERM
, proces nie jest uruchomiony, więc nie można uruchomić kodu, aby wyjść.
(Istnieją również SIGTTIN
i SIGTTOU
, które są sygnałami generowanymi przez warstwę TTY, gdy zadanie w tle próbuje odczytać lub zapisać na terminalu. Można je złapać, ale w przeciwnym razie zatrzymają (zawieszą) proces, tak jak teraz SIGTSTP
. Ale teraz idę zignorować tych dwóch do końca tej odpowiedzi).
Twój CtrlZwysyła proces a SIGTSTP
, który wydaje się nie być w żaden sposób obsługiwany specjalnie rsyslogd
, więc po prostu zawiesza proces w toku SIGCONT
lub SIGKILL
.
Rozwiązaniem tutaj jest również wysyłanie SIGCONT
po twoim, SIGTERM
aby proces mógł odebrać i obsłużyć sygnał.
Przykład:
sleep 999 &
# Assume we got PID 456 for this process
kill -TSTP 456 # Suspend the process (nicely)
kill -TERM 456 # Terminate the process (nicely). Nothing happens
kill -CONT 456 # Continue the process so it can exit cleanly
Dokumentacja biblioteki GNU C wyjaśnia to całkiem dobrze, jak sądzę (moje podkreślenie):
Gdy proces jest zatrzymany, nie można dostarczyć do niego więcej sygnałów, dopóki nie będzie on kontynuowany , z wyjątkiem SIGKILL
sygnałów i (oczywiście) SIGCONT
sygnałów. Sygnały są oznaczone jako oczekujące, ale nie są dostarczane, dopóki proces nie będzie kontynuowany. Sygnał zawsze powoduje przerwanie procesu i nie może być blokowany, przetwarzane lub ignorowane. Możesz zignorować , ale zawsze powoduje to kontynuowanie procesu, jeśli zostanie zatrzymany. Wysłanie sygnału do procesu powoduje odrzucenie wszelkich oczekujących sygnałów stop dla tego procesu. Podobnie wszelkie oczekujące sygnały dla procesu są odrzucane, gdy odbiera sygnał zatrzymaniaSIGKILL
SIGCONT
SIGCONT
SIGCONT
kill -15
, co już wysłałeś”.