GNU/Linux >> Tutoriels Linux >  >> Linux

Comment forker un processus qui ne meurt pas à la sortie du shell ?

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, et disown 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 si setsid est utilisé dans un sh 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 .


Linux
  1. [Linux] :Comment exclure un répertoire lors de l'utilisation de la commande shell "tar"

  2. Comment exécuter un script dans Shell lorsqu'une touche de raccourci est enfoncée ?

  3. Comment démarrer toutes les sessions Shell dans un répertoire autre que $home ?

  4. Comment faire mourir le processus enfant après la sortie du parent?

  5. Comment récupérer un sémaphore lorsque le processus qui l'a décrémenté à zéro plante ?

Un PID de processus est-il garanti de rester le même tant que le processus ne meurt pas ?

Existe-t-il une distribution Linux ou un correctif du noyau qui efface l'espace mémoire d'un processus après la fin du processus ?

Comment exécuter un script lorsqu'un courrier arrive sur le serveur de messagerie ? (Debian)

Comment la copie sur écriture dans fork() gère-t-elle plusieurs fourches ?

Comment démarrer un deuxième shell en mode mono-utilisateur ?

Comment tuer un processus qui ne meurt jamais ?