web-dev-qa-db-fra.com

Comment créer un processus qui ne meurt pas à la fermeture de Shell?

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.

29
sligocki

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 &

13
Rich Homolka

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.)

37
grawity

Vérifiez vos paramètres de shell. Vous pouvez également essayer screen au lieu de Nohup.

5
Josh K