Comment puis-je me rattacher à une session détachée de mosh ou sinon me débarrasser de
Mosh: You have a detached Mosh session on this server (mosh [XXXX]).
c'est-à-dire quel est l'équivalent mosh de
screen -D -R
ou éventuellement
screen -wipe
De plus, où cette réponse peut-elle être trouvée dans la documentation?
Pour des raisons de sécurité, vous ne pouvez pas vous reconnecter, voir https://github.com/keithw/mosh/issues/394
Pour tuer la session détachée, utilisez le numéro PID affiché dans ce message (c'est la partie 'XXXX'.) Par exemple, si vous voyez -
Mosh: You have a detached Mosh session on this server (mosh [12345]).
Et peut exécuter cette commande:
kill 12345
En outre, pour fermer toutes les connexions , vous pouvez:
kill `pidof mosh-server`
Notez que si vous êtes actuellement connecté via mosh, cette dernière commande vous déconnectera également.
À mon grand étonnement, j'ai utilisé CRIU ( https://criu.org ) pour contrôler et redémarrer un client mosh et cela a fonctionné.
Choquant.
Trouvez le PID de votre client mosh:
$ ps -ef | Grep Mosh
Ensuite, installez CRIU conformément à leurs instructions.
Ensuite, checkpoint le comme ceci:
$ mkdir checkpoint
$ Sudo ./criu dump -D point de contrôle -t PID --Shell-job
Ensuite, restaurez-le:
$ Sudo ./criu restaurer -D point de contrôle --Shell-job
Et voilà. Votre client Mosh est de retour.
Une chose à noter, cependant, est que si votre ordinateur portable redémarre (ce qui est l’essentiel de ce que nous essayons de protéger), mosh utilise une horloge monotonic
pour suivre le temps du côté client, ce qui ne fonctionne pas lors des redémarrages. Cela ne fonctionnera PAS, cependant, si votre ordinateur portable tombe en panne, il ne fonctionnera pas, car les numéros de séquence de mosh ne seront plus synchronisés avec la version contrôlée (le binaire reprendra, mais la communication sera interrompue).
Afin de résoudre ce problème, vous devez dire à mosh de ne plus le faire et de télécharger le code source de mosh. Ensuite, éditez ce fichier:
cd mosh
vim configure.ac
Ensuite, recherchez GETTIME
et commentez cette ligne.
Alors fais:
autoreconf # ou ./autogen.sh si vous venez de le cloner pour la première fois
./configurer
make
faire installer
Après cela, vos sessions client mosh contrôlées par CRIU survivront aux redémarrages.
(Évidemment, vous auriez besoin d'écrire quelque chose pour effectuer les points de contrôle assez régulièrement pour être utile. Mais c'est un exercice pour le lecteur).
Je réalise que ceci est un vieux post, mais il existe une solution très simple à cela, comme suggéré par Keith Winstein, auteur de mosh, ici: https://github.com/mobile-Shell/mosh/issues/394
"Eh bien, tout d’abord, si vous voulez pouvoir attacher à une session à partir de plusieurs clients (ou après la mort du client), vous devez utiliser screen ou tmux. Mosh remplace (dans certains cas) SSH, et non pas screen. De nombreux utilisateurs de Mosh l'utilisent avec screen et l'aiment ainsi. "
Scénario: Je suis connecté à un serveur distant via mosh. J'ai ensuite exécuté screen et un processus est en cours d'exécution dans la session screen, htop, par exemple. Je perds la connexion (la batterie d'un ordinateur portable meurt, la connexion au réseau est perdue, etc.). Je me connecte à nouveau via mosh et reçois ce message sur le serveur,
Mosh: Vous avez une session Mosh détachée sur ce serveur (mosh [XXXX]).
Tout ce que je dois faire est tuer la session précédente de mosh
tuer XXXX
et rattachez-vous à la session d'écran qui existe toujours .
écran -r
Maintenant, htop (ou le processus en cours d'exécution) est de retour tel quel, sans interruption. C'est particulièrement utile pour exécuter des mises à niveau ou d'autres processus qui laisseraient le serveur dans un état confus et inconnu en cas d'interruption soudaine. Je suppose que vous pouvez faire la même chose avec tmux, bien que je n’aie pas essayé. Je crois que c'est ce que suggèrent Annihilannic et eskhool.
En complément de la réponse de Varta, j'utilise la commande suivante pour fermer toutes les connexions mosh, à l'exception de la connexion actuelle:
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill
Comme @varta l'a fait remarquer, les propriétaires de mosh s'opposent vivement à toute nouvelle attache de différents clients pour des raisons de sécurité. Ainsi, si votre client est parti (par exemple, vous avez redémarré votre ordinateur portable), votre seule option est de tuer les sessions.
Pour ne tuer que les sessions détachées, vous pouvez utiliser la ligne suivante (mon alias dans mon .bashrc
).
who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill
Cette commande dépend du fait que who
répertorie les utilisateurs connectés, y compris les sessions mosh. Seules les sessions mosh attachées ont "via mosh" et que les sessions mosh ont leur pid entre crochets. Donc, il trouve uniquement les pids des sessions mosh détachées et les passe à l'aide de xargs.
Voici un exemple who
result pour référence:
$ who
theuser pts/32 2018-01-03 08:39 (17X.XX.248.9 via mosh [193891])
theuser pts/17 2018-01-03 08:31 (17X.XX.248.9 via mosh [187483])
theuser pts/21 2018-01-02 18:52 (mosh [205286])
theuser pts/44 2017-12-21 13:58 (:1001.0)
Une alternative consiste à utiliser la variable d'environnement mosh-server MOSH_SERVER_SIGNAL_TMOUT
. Vous pouvez définir quelque chose comme 300 dans votre .bashrc
du côté serveur . Ensuite, si vous faites un pkill -SIGUSER1 mosh-server
il ne supprimera que les serveurs mosh qui n’ont pas été connectés au cours des 300 dernières secondes (les autres ignoreront le SIGUSER1). Plus d'informations dans le page de manuel de mosh-server . J'utilise la commande ci-dessus car, une fois aliasé, cela me semble plus simple.
Notez que, comme mentionné par @Annihilannic, si vous utilisez tmux/screen dans vos sessions mosh, ces sessions tmux/screen sont toujours présentes après la suppression des sessions mosh. Donc, vous pouvez toujours vous y attacher (pour que vous ne perdiez vraiment pas beaucoup en tuant les sessions de mosh elles-mêmes).
Les réponses ici prétendent que le meurtre mosh-server
est la seule option qui soit largement obsolète, car nous pouvons utiliser criu
et reptyr
pour récupérer et rattacher des processus arbitraires.
Sans compter que de nos jours, nous pouvons kill -USR1 mosh-server
ne tuer que les sessions détachées de manière propre et sûre, sans recourir à une sortie non sûre who
ou à des commandes fastidieuses pour éviter de tuer notre propre session.
A côté de la réponse criu
de Michael R. Hines, il y a un peu plus "léger" reptyr
qui peut être utilisé pour rattacher des processus démarrés par mosh-server
(c’est-à-dire pas le mosh-server
lui-même). J'utilise généralement
pstree -p <mosh-server PID>
pour lister l’arbre des processus sous le serveur détaché mosh, puis
reptyr PID
rattacher le processus souhaité à mon terminal actuel. Après avoir répété la procédure pour tous les processus qui me tiennent à cœur, je
kill -USR1 <mosh-server PID>
alors que je prends soin de ne tuer que les sessions que je sais être à moi (système partagé).
Utilisez la commande ps pour obtenir la liste des tâches en cours ou utilisez la commande ps -ef | grep mosh
Tuez le mosh PID en utilisant cette commande:
kill <pid>
En outre, pour fermer toutes les connexions mosh, vous pouvez:
Notez que si vous êtes actuellement connecté via mosh, cela vous déconnectera également.
kill `pidof mosh-server`