SIGSTOPet SIGKILLsont deux signaux qui ne peuvent pas être capturés et traités par un processus. SIGTSTPc'est comme SIGSTOPsauf qu'il peut être attrapé et manipulé.
Les signaux SIGSTOPet SIGTSTParrê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 SIGTTINet 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 SIGCONTou SIGKILL.
La solution ici est également d'envoyer SIGCONTaprès votre SIGTERMafin 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 SIGKILLsignaux et (évidemment) des SIGCONTsignaux. Les signaux sont marqués comme en attente, mais ne sont pas délivrés tant que le processus n'est pas poursuivi. Le SIGKILLsignal 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 SIGCONTsignal à un processus entraîne la suppression de tout signal d'arrêt en attente pour ce processus. De même, tous les SIGCONTsignaux en attente d'un processus sont rejetés lorsqu'il reçoit un signal d'arrêt
kill -15vous aviez déjà envoyé".