web-dev-qa-db-fra.com

Comment puis-je fermer un terminal sans tuer ses enfants (sans exécuter `écran` en premier)?

parfois, je gère une application dans le gnome-terminal, mais j'ai soudainement soudainement redémarrer Gnome ou quelque chose. Je suppose que la réponse à la question est également utile, alors je veux déconnecter de SSH où quelque chose se passe.

L'arbre terminal de Gnome ressemble à ceci:

gnome-terminal
    bash
        some-boring-process

Puis-je me 'détacher' bash de gnome-terminal (ou détacher some-boring-process de bash et redirige sa production quelque part)? Si je viens de tuer gnome-terminal, bash _ sera tué pour toutes ses subprocesses

36
valya

C'est exactement ce qu'est écran et tmux ont été créés pour. Vous exécutez la coquille à l'intérieur de la session d'écran/TMux et vous pouvez vous déconnecter/reconnecter à volonté. Vous pouvez également avoir plusieurs sessions de coquilles exécutées à l'intérieur d'un gnome-terminal.

10
jsbillings

screen , tmux , ou dtach (éventuellement avec dvtm ) sont tous parfaits pour cela, mais si c'est quelque chose où vous n'avez pas pensé à utiliser l'un de ceux-ci, vous pourrez peut-être exploiter Nohup .

6
Hank Gay

Si vous voulez continuer à interagir avec le processus d'enfant plutôt que de simplement l'établir et que cela continue à continuer, il y a en fait un programme appelé Retty qui est une preuve de concept pour "voler" un processus de son ACTULTRES ACTUELS ET REATINGEZ-LE À L'ACTUEL.

Cependant, il fait de certaines choses horribles, notamment de coller un code d'assemblage sur la pile de l'application ré-attachée. Et ce code n'a pas été mis à jour pour X86_64.

Un autre programme prend une approche peut-être une meilleure approche, gelant le processus dans l'espace utilisateur à un fichier, à partir duquel il peut être restauré ultérieurement (éventuellement sur une autre TTY.) Ceci est cryopide , et ce projet Il semble trop se faire arrêter dans la phase de la preuve de concept et ne fonctionne pas avec Modern Linux au fur et à mesure que le code se trouve. Et bien.

Je pensais juste que cela devrait être ici pour la complétude. Si cela ne vous dérange pas de recourir à Horrible Voodoo, c'est dans le domaine de la possibilité - au moins une possibilité théorique.

4
mattdm

Si je tire quelque chose à quoi je veux finir, je veux finir, peu importe ce que (à court de système de redémarrage du système), j'utilise Nohup et exécutez-le à l'arrière-plan. Contrairement à l'écran et à celui que vous ne pouvez pas parcourir les processus. Cependant, la redirection de la barrage ailleurs une sortie peut être trouvée dans Nohup.out.

J'utilise screen lorsque je veux pouvoir changer de terminal pour un processus. Comme le démarrage d'un processus de domicile/travail et de passer à l'autre. Comme toute autre sortie de session de terminal éventuellement faire défiler le haut du tampon.

EDIT: Si vous avez déjà lancé le processus, vous pouvez disown le processus pour empêcher le signal HUP d'être envoyé lorsque le processus se ferme.

2
BillThor

Vous pouvez créer un processus (PID) ne pas recevoir de signal HUP lorsque la session de terminal est terminée. Utilisez la commande suivante:

Nohup -p PID
1
tony

Ce script détache le processus enfant de parent et l'attribue à init Processus:

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
1
mark_infinite