Disons que je lance un tas de processus à partir d'une session ssh. Est-il possible de mettre fin à la session ssh tout en maintenant ces processus en cours d'exécution sur la machine distante?
Vous devriez chercher des alternatives modernes comme tmux
.
tmux
est supérieur à screen
pour de nombreuses raisons, voici quelques exemples:
- Les fenêtres peuvent être déplacées entre les sessions et même liées à plusieurs sessions
- Les fenêtres peuvent être divisées horizontalement et verticalement en volets
- Prise en charge des terminaux UTF-8 et 256 couleurs
- Les sessions peuvent être contrôlées à partir du shell sans qu'il soit nécessaire d'entrer une session
Fonctionnalités de Base
Pour obtenir la même fonctionnalité que celle expliquée dans le réponse recommander screen
, vous auriez besoin de faire ce qui suit:
- ssh dans la machine distante
- commencer
tmux
en tapanttmux
dans la coquille - démarrez le processus que vous souhaitez dans le menu Démarrer
tmux
session - laissez / détachez le
tmux
session en tapant Ctrl+b et puis d
Vous pouvez maintenant vous déconnecter en toute sécurité de la machine distante, votre processus continuera à s'exécuter à l'intérieur tmux
. Lorsque vous revenez et que vous souhaitez vérifier l'état de votre processus, vous pouvez utiliser tmux attach
à joindre à votre tmux
session.
Si vous souhaitez que plusieurs sessions s'exécutent côte à côte, vous devez nommer chaque session en utilisant Ctrl+b et $
. Vous pouvez obtenir une liste des sessions en cours d'exécution en utilisant tmux list-sessions
, maintenant attaché à une session en cours d'exécution avec la commande tmux attach-session -t <session-name>
.
tmux
peut faire des choses beaucoup plus avancées que de gérer une seule fenêtre en une seule session. Pour plus d'informations, consultez man tmux
ou la page GitHub de tmux. Notamment, voici une FAQ à propos des principales différences entre screen
et tmux
.
Option 1: nohup
La meilleure façon est souvent la plus simple.
nohup long-running-command &
Il a été spécialement conçu pour cela, il enregistre même stdout sur nohup.log
.
man nohup
Option 2: bg
+ disown
ctrl+zbgdisown -h
Si vous souhaitez "arrière-plan"des tâches déjà en cours d'exécution, puis Ctrl+Z puis courez bg
pour mettre votre tâche suspendue la plus récente en arrière-plan, lui permettant de continuer à s'exécuter. disown
gardera le processus en cours d'exécution après votre déconnexion. Le -h
le drapeau empêche le raccrochage.
screen
et d'autres peuvent le faire, mais ce n'est pas à cela qu'ils servent. Je recommande nohup
pour les tâches que vous savez que vous allez laisser derrière vous et bg
pour les tâches que vous exécutez déjà et que vous ne souhaitez pas redémarrer.
Gardez à l'esprit que les deux sont spécifiques à bash. Si vous n'utilisez pas bash, les commandes peuvent être différentes.
Vous pouvez le faire en utilisant screen
.
Type man screen
pour en savoir plus ou lire ceci page de manuel d'écran.
Scénario simple:
ssh dans votre boîtier distant. Type
screen
Ensuite, démarrez le processus souhaité.Appuyer Ctrl-A puis Ctrl-D. Cela "détachera" votre session d'écran mais laissera vos processus en cours d'exécution. Vous pouvez maintenant vous déconnecter de la boîte distante.
Si vous souhaitez revenir plus tard, connectez-vous à nouveau et tapez
screen -r
Cela "reprendra" votre session d'écran et vous pourrez voir la sortie de votre processus.
Screen et nohup est le meilleur moyen, mais si vous devez détacher un processus déjà en cours d'exécution sans screen ou nohup, vous pouvez exécuter la commande disown.
disown [-ar] [-h] [
jobspec
… |
pid
… ]
Sans options, supprimez chaque jobspec du tableau des emplois actifs. Si le
-h
l'option est donnée, le travail n'est pas supprimé de la table, mais est marqué de sorte que SIGHUP ne soit pas envoyé au travail si le shell reçoit un SIGHUP. Si jobspec n'est pas présent, et ni le-a
ni le-r
l'option est fournie, le travail en cours est utilisé. Si non jobspec est fourni, le-a
option signifie supprimer ou marquer tous les travaux; le-r
option sans a jobspec l'argument limite l'opération à l'exécution des tâches.
Avec disown, vous pouvez fermer le terminal et lancer le processus sur la machine.
J'étais coincé dans un grand mv, je n'étais donc pas en mesure d'arrêter le processus, de configurer l'écran, puis de le redémarrer. J'ai réussi à quitter la session SSH avec le processus en cours d'exécution en effectuant essentiellement les étapes suivantes:
- Établir une connexion SSH:
ssh user@host
- Exécutez la commande souhaitée pour démarrer le processus
- Appuyer Ctrl+Z pour suspendre le processus
- Exécuter
bg
pour mettre le processus en pause en arrière-plan et le reprendre. - Exécuter
disown [pid]
(l'ID de processus est facultatif, par défaut le dernier processus) pour désavouer le processus. Pour obtenir une liste des emplois, tapez simplementjobs
avant. - Quittez la session SSH en exécutant
logout
.
Utilisation du site disown
commande:
disown [-ar] [-h] [jobspec ... | pid ... ] Without options, remove each jobspec from the table of active jobs. If jobspec is not present, and neither the -a nor the -r option is supplied, the current job is used. If the -h option is given, each jobspec is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If no jobspec is supplied, the -a option means to remove or mark all jobs; the -r option without a job‐ spec argument restricts operation to running jobs. The return value is 0 unless a jobspec does not specify a valid job.
Il existe deux programmes principaux que vous pouvez utiliser pour maintenir les programmes et l'état du terminal sur plusieurs connexions ssh. Ils sont à l'écran (le titulaire, mais malheureusement non entretenus. Apparemment être activement développé maintenant) et tmux (plus récent, activement maintenu). Byobu est un frontal qui peut fonctionner sur l'un de ces systèmes et offrir des informations supplémentaires sur l'état d'Ubuntu. Sur les nouvelles installations, il utilisera tmux comme backend, si vous avez une ancienne installation de byobu et une configuration existante, il maintiendra le backend précédent, que ce soit screen ou tmux.
Byobu
Byobu peut être installé sur l'ordinateur en le faisant sur une machine basée sur Debian:
sudo aptitude install byobu
En utilisant miam, vous le faites
su -c 'yum install byobu'
Il est également possible d'installer byobu sur d'autres distributions.
Utilisation de byobu
Vous pouvez démarrer byobu en courant byobu
sur la machine hôte après la connexion à l'aide de ssh.Cela vous donnera une coquille qui ressemble à ceci:
Vous pouvez également utiliser le terminal Byobu sur une machine Ubuntu avec l'option-X et avoir facilement un byobu parfaitement fonctionnel.
Utilisation:
Commencez byobu en tapant byobu
.
Vous pouvez appuyer sur F2 pour créer une nouvelle fenêtre dans la session en cours, F3-F4 pour basculer entre les différentes fenêtres.
La meilleure partie de byobu est que vous n'avez pas à tuer les processus en cours d'exécution dans le terminal pour quitter le terminal. Vous pouvez simplement envoyer screen / tmux (le squelette de byobu) en arrière-plan et reprendre la prochaine fois que vous viendrez:
Pour quitter byobu et le maintenir en marche (détacher) appuyez sur F6.
-
La prochaine fois que tu viendras, fais-le
byobu
et tu devrais retourner là où tu étais.
Vous pouvez également créer diverses sessions byobu en byobu -S session1
et ainsi de suite. Et vous pouvez vous connecter à l'un d'eux à votre retour.
Vous pouvez faire beaucoup plus en utilisant Byobu. Utilise-le!Certains guides définitifs sont ici, ou ici.
Vous ne pouvez pas le faire une fois le processus démarré, vous devez avoir configuré les choses avant d'exécuter un travail de longue durée.
Vous pouvez utiliser nohup mais la sagesse moderne suggère que vous utilisiez screen ou byobu comme identifiant afin de pouvoir vous détacher et laisser les choses fonctionner.
Screen a l'avantage de pouvoir se détacher d'une machine et se rattacher d'une autre, ce qui est pratique si vous souhaitez vérifier les processus de longue durée qui s'exécutent au-delà de la fin de la journée de travail.
Il y a une mise en route raisonnable guide de l'écran ici.
byobu met une interface facile à utiliser en haut de l'écran avec des menus, etc. C'est aussi l'implémentation actuelle de screen sur ubuntu plus récent. F2 pour démarrer un nouveau terminal F3/F4 pour basculer d'avant en arrière et F6 pour déconnecter. Tapez exit pour mettre fin aux terminaux de manière permanente.
Pour un script shell unique que j'ai exécuté sur une longue période, je vais me connecter et exécuter le processus en arrière-plan en utilisant '&'.
Exemple:
/path/to/my/script &
Je me suis déconnecté et déconnecté ma session SSH. Lorsque je me connecte quelque temps plus tard, le script est toujours en cours d'exécution, comme le prouve la collecte continue de données à partir du script.
Hé, alors que je suis d'accord que l'écran est l'option la plus efficace.Vous pouvez utiliser vncserver, puis démarrer le processus dessus.
De plus, si votre seul intérêt est d'avoir le processus en cours d'exécution et qu'il n'est pas nécessaire d'en reprendre le contrôle, et le plus important, vous n'étiez pas au courant que vous devrez fermer la session et que le processus est déjà en cours d'exécution, vous n'avez pas de chance si vous avez utilisé bash comme shell
Vous devez d'abord envoyer le processus en arrière-plan en tapant Ctrl + Z suivi de bg %1 (le nombre dépend du numéro du travail, il est généralement de 1, mais vous pouvez facilement extraire la liste à l'aide de la commande jobs)
Enfin, invoquez la commande disown (suivie du jobid ... identique à la commande bg)
Cela supprimera la relation parent-enfant entre votre shell et le processus en arrière-plan, l'empêchant de mourir lorsque votre shell est terminé.
Vous devriez vérifier Écran GNU et voyez si cela vous aide. Selon la façon dont vous avez besoin que votre application s'exécute en temps réel, elle peut causer plus de problèmes qu'elle n'en résout, mais au moins elle vous permettra de reprendre votre session comme si vous ne l'aviez jamais quittée.
Comment utiliser :
- Utilisez la commande
screen
pour le premier démarrage, faites défiler les messages d'introduction, vous devriez recevoir un terminal. - C-a C-c ouvre un autre terminal
- C-a C-k tue un terminal
- Vous pouvez utiliser C-a C-Space et C - a C-Backspace pour parcourir les terminaux
- C-a C - a est pratique si vous n'utilisez principalement que deux terminaux
- C-a C-d détache la session d'écran en cours et quitte les écrans. Vous pouvez ensuite utiliser
screen -r
pour reprendre cette session. Vous pouvez avoir plusieurs sessions d'écran détachées à la fois, dans ce cas, une liste des sessions disponibles s'affichera.
Il existe de nombreuses autres options, par exemple des écrans partagés, et tous les raccourcis sont entièrement personnalisables.