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
disowncommande intégrée :emacs & disown $!&agit comme séparateur de commandes, etdisownsera 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 emacsCependant, 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 sisetsidest utilisé dans unshscé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 .