SIGSTOP
et SIGKILL
sont deux signaux qui ne peuvent pas être capturés et traités par un processus. SIGTSTP
c'est comme SIGSTOP
sauf qu'il peut être attrapé et manipulé.
Les signaux SIGSTOP
et SIGTSTP
arrêtent un processus sur ses traces, prêt pour SIGCONT
. Lorsque vous envoyez ce processus a SIGTERM
, le processus n'est pas en cours d'exécution et il ne peut donc pas exécuter le code pour quitter.
(Il y a aussi SIGTTIN
et SIGTTOU
, qui sont des signaux générés par la couche TTY lorsqu'un travail en arrière-plan essaie de lire ou d'écrire sur le terminal. Ils peuvent être interceptés mais arrêteront (suspendront) le processus, tout comme SIGTSTP
. Mais je vais maintenant d'ignorer ces deux pour le reste de cette réponse.)
Votre CtrlZenvoie le processus a SIGTSTP
, qui ne semble pas être traité spécialement de quelque manière que ce soit rsyslogd
, donc il suspend simplement le processus en attente SIGCONT
ou SIGKILL
.
La solution ici est également d'envoyer SIGCONT
après votre SIGTERM
afin que le processus puisse recevoir et gérer le signal.
Exemple:
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 documentation de la bibliothèque GNU C l' explique assez bien, je pense (ma mise en évidence):
Lorsqu'un processus est arrêté, plus aucun signal ne peut lui être délivré tant qu'il n'est pas poursuivi , à l'exception des SIGKILL
signaux et (évidemment) des SIGCONT
signaux. Les signaux sont marqués comme en attente, mais ne sont pas délivrés tant que le processus n'est pas poursuivi. Le SIGKILL
signal provoque toujours la fin du processus et ne peut pas être bloqué, géré ou ignoré. Vous pouvez ignorer SIGCONT
, mais cela entraîne toujours la poursuite du processus s'il est arrêté. L'envoi d'un SIGCONT
signal à un processus entraîne la suppression de tout signal d'arrêt en attente pour ce processus. De même, tous les SIGCONT
signaux en attente d'un processus sont rejetés lorsqu'il reçoit un signal d'arrêt
kill -15
vous aviez déjà envoyé".