Comment puis-je fermer un terminal sans tuer ses enfants (sans lancer d'abord "screen")?


35

Parfois, je lance une application dans le gnome-terminal, mais je dois soudainement redémarrer gnome ou quelque chose du genre. Je suppose que la réponse à la question est également utile alors je veux me déconnecter de SSH où quelque chose se passe.

L'arborescence du terminal de Gnome ressemble à ceci:

gnome-terminal
    bash
        some-boring-process

Puis-je "détacher" bashde gnome-terminal(ou détacher some-boring-processde bash et rediriger sa sortie quelque part)? Si je tue juste gnome-terminal, bashsera tué à volonté tous ses sous-processus


Réponses:


48

Si some-boring-processest en cours d'exécution dans votre session bash actuelle:

  1. arrêter avec ctrl-zpour vous donner l'invite bash
  2. mettre en arrière-plan avec bg
  3. notez le numéro du travail ou utilisez la jobscommande
  4. détachez le processus de cette session bash avec disown -h %1(remplacez le numéro de travail réel ici).

Cela ne fait rien pour rediriger la sortie - vous devez y penser lorsque vous lancez votre processus ennuyeux. [Modifier] Il semble y avoir un moyen de le rediriger https://gist.github.com/782263

Mais sérieusement, regardez dans l'écran. J'ai des obus sur un serveur distant qui fonctionnent depuis des mois.


Merci. J'ai choisi votre réponse , car il était le seul qui répond à la question (il était sur le point déjà processus en cours d' exécution). J'utilise déjà screenparfois, bien que cela
pose

Vous ne l'utilisez pas pour chaque session bash, mais pour chaque ordinateur distant sur lequel vous passez beaucoup de temps.
Glenn Jackman

J'ai pris la liberté d'ajouter des informations sur la redirection de la sortie, merci de la lire!
Valya

[root @ server ~] # bg -bash: bg: actuel: pas de travail de ce type
Muhammad Dyas Yaskur

Pourquoi j'ai eu bash: bg: current: no such job?
Muhammad Dyas Yaskur

10

C'est exactement ce pour quoi screen et tmux ont été créés. Vous exécutez le shell dans la session screen / tmux et vous pouvez vous déconnecter / vous reconnecter à volonté. Vous pouvez également avoir plusieurs sessions shell en cours d'exécution dans un même terminal gnome.


Merci, mais, comme je l'ai commenté à la réponse acceptée: 1. la question portait sur le processus en cours d'exécution. 2. screena ses problèmes et je n'ai pas envie de l'utiliser à chaque session de ma vie
valya

6

screen, tmuxou dtach(éventuellement avec dvtm) sont excellents pour cela, mais si vous pensez ne pas en utiliser, vous pourrez peut-être en tirer parti nohup.


Merci, mais, comme je l'ai commenté à la réponse acceptée: 1. la question portait sur le processus en cours d'exécution. 2. screena ses problèmes et je n'ai pas envie de l'utiliser à chaque session de ma vie
Valya

@valya Glad vous avez trouvé une solution. Juste pour être clair, cependant, nohupfonctionne sur un processus en cours en utilisant l' -poption (si disponible).
Hank Gay

@Hank Gay: je ne vois aucune -poption nohupdans les pages de manuel; sur quel système êtes-vous?
Mikel

@ Mikel Avant d'avoir appris à cesser de m'inquiéter et à aimer le logiciel tmux, j'ai utilisé cette -poption sur une boîte Solaris. J'ai aussi de vagues souvenirs de l'avoir fait sur une boîte de zshbâtards CentOS (peut-être une fonction intégrée qui la prend en charge?), Mais je ne trouve aucun document à ce sujet.
Hank Gay

@Hank Gay: Ni sur mon système Linux Ubuntu bashni zshfourni nohup.
Mikel

4

Si vous souhaitez continuer à interagir avec le processus enfant plutôt que de le mettre en arrière-plan et de le laisser continuer, il existe en fait un programme appelé retty qui est une preuve de concept pour "voler" un processus de son tty actuel et le remettre en place sur le l'actuel.

Cependant, il fait des choses horribles, notamment en collant du code d'assemblage sur la pile de l'application réattachée. Et ce code n'a pas été mis à jour pour x86_64.

Il existe un autre programme qui adopte une approche peut-être meilleure, gelant le processus dans l’espace utilisateur dans un fichier, à partir duquel il peut être restauré ultérieurement (éventuellement sur un autre tty.). Ceci est un cryopid , et ce projet semble aussi s’être arrêté dans le phase de validation de principe, et ne fonctionne pas avec Linux moderne en l'état. Et bien.

Juste pensé que cela devrait être ici pour être complet. Si le fait de recourir à un horrible vaudou ne vous dérange pas, c'est une possibilité - du moins une possibilité théorique.


1
cela me fait penser à gist.github.com/782263 ... oh, cet élément essentiel semble également répondre à ma question
Valya

2

Si je lance quelque chose que je veux finir quoi qu'il arrive (à part le redémarrage du système), je l'utilise nohupet l'exécute en arrière-plan. Contrairement à l'écran et autres, vous ne pouvez pas vous reconnecter aux processus. Cependant, on peut trouver n'importe quelle sortie à part la redirection ailleurs nohup.out.

J'utilise screenquand je veux pouvoir changer de terminal pour un processus. Tels que démarrer un processus de la maison / du travail et passer à l’autre. Comme toute autre session de terminal, la sortie finira par défiler en haut de la mémoire tampon.

EDIT: Si vous avez déjà lancé le processus, vous pouvez disownempêcher le HUPsignal d’être envoyé à la fermeture du processus.


Merci, mais, comme je l'ai commenté à la réponse acceptée: 1. la question portait sur le processus en cours d'exécution. 2. screena ses problèmes et je n'ai pas envie de l'utiliser à chaque session de ma vie
valya

@valya J'ai vu des références à la déconnexion d'un processus en cours du groupe de programmes. Je ne connais aucun outil pour le faire cependant. L'outil aurait probablement aussi besoin de rediriger les canaux d'E / S std. Je pense que je l’ai peut-être déjà fait fonctionner une fois, mais j’ai décidé que rien n’était plus simple.
BillThor

1

Vous pouvez empêcher un processus (PID) de recevoir un signal HUP à la fin de la session du terminal. Utilisez la commande suivante:

nohup -p PID

nohup: invalid option -- 'p'. Quelle version de nohupvous utilisez sur quel type de système?
Anthon

J'utilise principalement Solaris et AIX. Pour Linux, vous devriez vérifier dans la commande disown.
tony

Oui, il n'y a pas d' -poption sous Linux. Cette réponse est donc spécifique à Solaris et AIX. Bon à savoir cependant
Sergiy Kolodyazhnyy

1

Ce script dissocie le processus enfant du parent et l'assigne au processus init :

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.