SIGSTOP
y SIGKILL
son dos señales que no pueden ser captadas y manejadas por un proceso. SIGTSTP
es como, SIGSTOP
excepto que puede ser atrapado y manejado.
Las señales SIGSTOP
y SIGTSTP
detienen un proceso en su camino, listo para SIGCONT
. Cuando envía ese proceso a SIGTERM
, el proceso no se está ejecutando y, por lo tanto, no puede ejecutar el código para salir.
(También hay SIGTTIN
y SIGTTOU
, que son señales generadas por la capa TTY cuando un trabajo en segundo plano intenta leer o escribir en el terminal. Se pueden capturar pero de lo contrario se detendrá (suspenderá) el proceso, al igual que SIGTSTP
. Pero ahora voy ignorar esos dos por el resto de esta respuesta.)
Su CtrlZenvía el proceso a SIGTSTP
, que parece no ser manejado especialmente de ninguna manera rsyslogd
, por lo que simplemente suspende el proceso pendiente SIGCONT
o SIGKILL
.
La solución aquí también es enviar SIGCONT
después de usted SIGTERM
para que el proceso pueda recibir y manejar la señal.
Ejemplo:
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
La documentación para la Biblioteca GNU C explica esto bastante bien, creo (mi resaltado):
Mientras se detiene un proceso, no se pueden enviar más señales hasta que continúe , excepto las SIGKILL
señales y (obviamente) las SIGCONT
señales. Las señales se marcan como pendientes, pero no se entregan hasta que se continúa el proceso. La SIGKILL
señal siempre provoca la finalización del proceso y no se puede bloquear, manejar o ignorar. Puede ignorar SIGCONT
, pero siempre hace que el proceso continúe de todos modos si se detiene. Al enviar una SIGCONT
señal a un proceso, se descartan las señales de parada pendientes para ese proceso. Del mismo modo, cualquier SIGCONT
señal pendiente para un proceso se descarta cuando recibe una señal de parada.
kill -15
que ya había enviado".