J'essaie de détacher un processus d'un script bash afin que SIGINT ne soit pas transmis au processus lorsque je quitte le script.
J'ai utilisé la disown
commande directement dans le terminal, mais dans bash, cela disown
n'empêche pas le transfert de SIGINT. Le but de ce script est de démarrer openocd puis gdb avec une seule invocation. Étant donné que le script ne se ferme jamais (il exécute gdb), SIGINT est toujours transmis de gdb à openocd, ce qui est un problème car SIGINT est utilisé comme commande d'arrêt dans gdb.
Dans le terminal, cela ressemblerait à ceci:
$ openocd & # run openocd demonized
$ disown $! # disown last pid
$ gdb # invoke GDB
lorsqu'il est invoqué sur le terminal dans cet ordre, le SIGINT n'est pas passé de gdb à openocd. Cependant, si cette même invocation était dans un script bash, le SIGINT est passé.
Toute aide serait grandement appréciée.
ps ce problème est sous OS X mais j'essaie d'utiliser des outils qui sont également portables pour tous les outils Unix.
nohup
n'est pas tout à fait la bonne réponse. Vous devez ajouter un pseudocode ou un exemple de code pour montrer plus précisément ce que vous voulez.screen
?Réponses:
Pour détacher un processus d'un script bash:
Si vous arrêtez votre script bash avec
SIGINT
(ctrl + c), ou si le shell quitte l'envoiSIGHUP
par exemple, le processus ne sera pas dérangé et continuera à s'exécuter normalement.stdout
Etstderr
sera redirigé vers un fichier journal:nohup.out
.Si vous souhaitez exécuter une commande détachée tout en pouvant voir la sortie dans le terminal, utilisez alors
tail
:la source
nohup
nécessaire? Quelle est la différence entrenohup COMMAND &
etCOMMAND &
si votre objectif est uniquement d'exécuter la commande en arrière-plan et de libérer le terminal?Pour moi, cela fonctionne parfaitement bien avec le reniement
la source
La solution que j'ai trouvée implique un programme appelé «détachement» écrit par Annon Inglorion et téléchargeable à partir de son site Web
Une fois compilé, il peut être utilisé dans un script comme suit:
Cette première ligne crée un nouveau processus (exécutant openocd) et stocke l'ID du processus dans le fichier (debug.pid) pour une utilisation ultérieure. Cela évite les problèmes de recherche du pid comme indiqué dans la réponse d'Oliver. En quittant le programme de blocage suivant (gdb), le fichier stockant le pid est utilisé pour tuer directement le processus détaché.
la source
detach
fait des merveilles.une solution simple et portable:
Quelques mises en garde
ps
concernant la portabilité: les options dépendent du système d'exploitation! vous pourriez plutôt utiliser une variante de:{ ps -ef || ps aux ;} | grep '[o]penocd | cut -f 1
.at
n'a pas pu être disponible (bizarre, mais cela arrive ...).$(...)
nécessite un shell pas vraiment vieux, sinon utilisez des astuces.la source
at
démarré un script qui lance le programme et donne son pid à la place dans un fichier, et faire attendre le script principal fichier à apparaître, puis lisez-le.