SIGSTOPy SIGKILLson dos señales que no pueden ser captadas y manejadas por un proceso. SIGTSTPes como, SIGSTOPexcepto que puede ser atrapado y manejado.
Las señales SIGSTOPy SIGTSTPdetienen 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 SIGTTINy 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 SIGCONTo SIGKILL.
La solución aquí también es enviar SIGCONTdespués de usted SIGTERMpara 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 SIGKILLseñales y (obviamente) las SIGCONTseñales. Las señales se marcan como pendientes, pero no se entregan hasta que se continúa el proceso. La SIGKILLseñ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 SIGCONTseñal a un proceso, se descartan las señales de parada pendientes para ese proceso. Del mismo modo, cualquier SIGCONTseñal pendiente para un proceso se descarta cuando recibe una señal de parada.
kill -15que ya había enviado".