Si je lance emacs à partir de Shell:
$ emacs foo &
puis tuez Shell, Emacs meurt.
Comment puis-je exécuter une commande afin qu'elle ne meure pas lorsque le shell meurt?
J'ai trouvé des références à Nohup, mais cela ne semble pas aider:
$ Nohup emacs foo &
tue toujours emacs quand Shell meurt.
Vous ne mentionnez pas s'il s'agit d'une application X ou d'une application console.
Si c'est comme une application console, il faut bien sûr fermer. Vous vous êtes débarrassé de son entrée/sortie, plus techniquement du (pseudo) tty sur lequel il était. Il est très peu probable que ce soit ce que vous vouliez dire, alors supposons que vous parlez d'une application X.
Nohup
devrait fonctionner, vous ne savez pas pourquoi. Lorsque le shell se ferme, il envoie SIGHUP
à tous les processus de son groupe de processus. Nohup dit à la commande d'ignorer SIGHUP.
Vous pouvez également essayer setsid, qui déconnecte le processus du groupe de processus.
alias emacs='setsid emacs'
Ou ajoutez disown
après &
La méthode la plus fiable semble être:
(setsid emacs &)
Ceci utilise ( &)
pour aller en arrière-plan et setsid
pour se détacher du terminal de contrôle.
Vous pouvez mettre ceci dans une fonction Shell:
fork() { (setsid "$@" &); }
fork emacs
Les possibilités sont:
La commande intégrée disown
:
emacs &
disown $!
&
agit en tant que séparateur de commande et disown
utilisera par défaut le travail le plus récent. Vous pouvez donc le réduire à:
emacs & disown
Double -fork()
:
(emacs &)
Les commandes entre parenthèses (
)
sont exécutées dans un processus Shell distinct.
setsid
, comme suggéré par Rich, pourrait être le meilleur choix, car il désactive le TTY de contrôle du processus en créant une nouvelle session :
setsid emacs
Cependant, il est également un peu imprévisible - cela ne remplacera fork()
si c'est le responsable d'un groupe de processus (ce qui ne se produira pas si setsid
est utilisé dans un script sh
, par exemple; dans ce cas, il deviendra simplement résistant en Ctrl-C.)
Vérifiez vos paramètres de shell. Vous pouvez également essayer screen au lieu de Nohup
.