Je cherche à comprendre deux points de la gestion des signaux en shell :
1 - pourquoi le script suivant peut-être interrompu "proprement" lorsqu'il est exécuté en foreground dans une console (par exemple avec le Ctrl+C, SIGINT) alors que depuis une console tierce, l'envoie d'un signal SIGINT est ignoré ? Est-ce lié à la gestion des tty ?
2 - pourquoi, enfin, un SIGKILL lancé depuis une autre console résulte dans l'arrêt du seul /bin/sh (le sleep restant en arrière plan, et fils du PID 1) ?
#!/bin/sh
sleep 3600
En recherchant la ou les explications de ces comportements, je souhaiterais surtout trouver un moyen pour interrompre "récursivement" tous les processus fils d'un processus déterminé (script shell), comme, me semble-t'il, lorsque ce dernier recoît un Ctrl+C.
Bien sûr, le "sleep" peut être remplacé par une ou plusieurs autres commandes externes; un "ls -R /" par exemple. Le comportement décrit semble répandu : sur Linux, Solaris & Cygwin (W2K), et avec bash, ksh ou csh.
Merci pour vos réponses ou pistes éventuelles.
# I go to sleep
Posté par phoenix (site web personnel) . Évalué à 2.
Donc faire un script peut interrompre le premier sleep mais pas le deuxième (à tester). Sinon, c'est que le Ctrl+C se fait sur tous les processuce, jusqu'à ce que l'application rende la main
#!/bin/sh
sleep 3600
sleep 3600
Quand tu fais un kill, tu envois le kill au script et donc à Sh. Les enfants n'étant pas tué.
Regarde par un man kill, s'il n'y a pas une option qui permet de tuer recursivement (il me semble avoir déjà vu ça quelque part).
[^] # Re: I go to sleep
Posté par xfred31 . Évalué à 1.
Le man ne dit rien sur la récursivité.
Merci pour ta réponse en tout cas.
# groupe de processus
Posté par Bastien Mourgues . Évalué à 2.
C'est le shell qui change le pgid et le masque de signaux avant de lancer tes commandes en background ou en foreground. C'est pour cela que tu as un comportement différent suivant comment ta commande est lancée. Libre à toi de rechanger ce masque de signaux dans l'applicatif lancé (cf. la commande trap pour les shell scripts ; en particulier trap - SIGINT remet l'action par défaut sur réception de sigint, soit mourir :) ).
Bon, y aurait vraiment beaucoup à dire sur les signaux,pid,pgid, je te conseille de te documenter sur les signaux unix en général histoire de comprendre les aspects théoriques (désolé, j'ai pas de liens à te filer, mais ça doit pouvoir se trouver sur le net, je pense).
[^] # Re: groupe de processus
Posté par xfred31 . Évalué à 1.
Merci pour ces éclaircissements; la notion de groupe de processes m'était assez obscure jusqu'à maintenant.
Je pense avoir compris : dans un programme C, utiliser le setpgid() dans le fils me permet de le signaler avec un -PID - ce qui entraine à première vue le comportement que j'attendais.
J'imagine que c'est ce que fais le shell pour les nouveaux processes en mode interactif, par exemple, et que c'est ce comportement que tu décrivais.
Merci encore !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.