La méthode la plus fiable semble être :
(setsid emacs &)
Cela utilise ( &)
pour bifurquer vers l'arrière-plan, et setsid
à détacher du terminal de contrôle.
Vous pouvez mettre ceci dans une fonction shell :
fork() { (setsid "[email protected]" &); }
fork emacs
Les possibilités sont :
-
Le
disown
commande intégrée :emacs & disown $!
&
agit comme séparateur de commandes, etdisown
sera par défaut le travail le plus récent, donc cela peut être raccourci à :emacs & disown
-
Double-
fork()
:(emacs &)
Commandes entre parenthèses
(
)
sont exécutés dans un processus shell séparé. -
setsid
, comme suggéré par Rich, pourrait être le meilleur choix, car il annule le TTY de contrôle du processus en créant une nouvelle session :setsid emacs
Cependant, c'est aussi un peu imprévisible - ça ne fera que
fork()
en arrière-plan s'il est le leader d'un groupe de processus (ce qui n'arrivera pas sisetsid
est utilisé dans unsh
scénario, par exemple ; dans de telles occasions, il deviendra simplement résistant à Ctrl-C.)
Vous ne mentionnez pas si cela s'exécute en tant qu'application X ou en tant qu'application console.
S'il s'agit d'une application console, elle doit bien sûr se fermer. Vous vous êtes débarrassé de son entrée/sortie, plus techniquement du (pseudo) tty sur lequel il se trouvait. Il est très peu probable que ce soit ce que vous vouliez dire, alors supposons que vous parliez d'une application X.
nohup
devrait fonctionner, je ne sais pas pourquoi ce n'est pas le cas. Lorsque le shell se ferme, il envoie SIGHUP
à tous les processus de son groupe de processus. nohup indique à 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 &
Vérifiez les paramètres de votre shell. Vous pouvez également essayer screen au lieu de nohup
.