J'ai un CD live qui démarre sous Linux et exécute un petit script Bash. Le script recherche et exécute un deuxième programme (qui est généralement un binaire C ++ compilé).
Vous êtes censé pouvoir abandonner le deuxième programme en appuyant sur Ctrl+ C. Ce qui devrait arriver, c'est que le deuxième programme s'arrête et que le script Bash continue d'exécuter le nettoyage. En réalité, l'application principale et le script Bash se terminent. C'est un problème.
J'ai donc utilisé la fonction trap
intégrée pour dire à Bash d'ignorer SIGINT. Et maintenant Ctrl+ Ctermine l'application C ++, mais Bash continue son exécution. Génial.
Oh ouais ... Parfois, la "deuxième application" est un autre script Bash. Et dans ce cas, Ctrl+ Cmaintenant ne fait plus rien du tout .
De toute évidence, ma compréhension du fonctionnement de ces éléments est erronée ... Comment puis-je contrôler quel processus obtient SIGINT lorsque l'utilisateur appuie sur Ctrl+ C? Je veux diriger ce signal vers un seul processus spécifique .
set -m
. C'est un peu plus propre et plus simple que d'utilisersetsid
chaque fois que vous exécutez un enfant.Comme je l'ai mentionné dans le commentaire de f01, vous devriez envoyer SIGTERM au processus enfant. Voici quelques scripts qui montrent comment intercepter ^ C et envoyer un signal à un processus enfant.
Tout d'abord, le parent.
traptest
Et maintenant, l'enfant.
Sleeploop
Si Traptest envoie SIGTERM, les choses se comportent bien, mais si Traptest envoie SIGINT, Sleeploop ne le voit jamais.
Si Sleeploop piège SIGTERM et que le mode veille est au premier plan, il ne peut pas répondre au signal jusqu'à ce qu'il se réveille du sommeil actuel. Mais si le mode veille est en arrière-plan, il répondra immédiatement.
la source
Dans votre script bash d'initiation.
garder une trace du PID du deuxième programme
attraper le SIGINT
lorsque vous avez attrapé un SIGINT, envoyez un SIGINT au deuxième programme PID
la source