193 votes

Comment se rattacher à une session de mosh détachée ?

Comment puis-je me rattacher à une session de mosh détachée ou me débarrasser autrement de

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).

c'est à dire quel est l'équivalent en mosh de

screen -D -R

ou éventuellement

screen -wipe

En outre, où peut-on trouver cette réponse dans la documentation ?

1 votes

Normalement, Mosh reconnecte les sessions (ou essaie de le faire) si elles sont déconnectées. Lorsque vous entrez de nouvelles données, il essaie de se reconnecter (pour les connexions défaillantes ou les connexions qui changent). Pour les suiveurs, cette "session détachée de Mosh" se produit lorsque vous hard kill une fenêtre client.

231voto

varta Points 366

Pour des raisons de sécurité, vous ne pouvez pas rattacher, 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

Aussi, pour fermer tous les connexions mosh que vous pouvez :

kill `pidof mosh-server`

Notez que si vous êtes actuellement connecté via mosh, cette dernière commande vous déconnectera également.

34 votes

@artfulrobot Parce qu'il y a une chance que la session détachée appartienne à un mosh-client qui est encore vivant quelque part. Les sessions Mosh sont mobiles et peuvent survivre à un cycle de suspension/reprise (par exemple, "Hibernation"). Le problème que mosh ne résout pas (et ne peut pas facilement) est de détecter que la machine cliente a redémarré sans fermer gracieusement la session mosh.

7 votes

Y a-t-il une raison de ne pas killall mosh-server à la place ? Surtout que pidof et killall sont vraiment la même chose de toute façon.

7 votes

@Jordan : Sur certains systèmes (Solaris, par exemple), killall fait exactement ce qu'il dit.

33voto

Michael R. Hines Points 389

À mon grand étonnement, j'ai utilisé le CRIU ( https://criu.org ) pour faire un checkpoint et redémarrer un client mosh et ça a marché.

C'est choquant.

Trouvez le PID de votre mosh-client :

$ ps -ef | grep mosh

Ensuite, installez le CRIU en suivant leurs instructions.

Puis, faites un point de contrôle comme ceci :

$ mkdir checkpoint

$ sudo ./criu dump -D checkpoint -t PID --shell-job

Ensuite, restaurez-le :

$ sudo ./criu restore -D checkpoint --shell-job

Et voilà, c'est fait. Votre client mosh est de retour.

Une chose à noter, cependant, est que si votre ordinateur portable redémarre (ce qui est le but de ce que nous essayons de protéger contre), mosh utilise une monotonic pour suivre le temps du côté client, ce qui ne fonctionne pas lors des redémarrages. Cependant, si votre ordinateur portable tombe en panne, cela ne fonctionnera PAS, car les numéros de séquence de mosh ne seront pas synchronisés avec la version qui a fait l'objet d'un point de contrôle (le binaire reprendra, mais la communication sera interrompue).

Pour résoudre ce problème, vous devez dire à mosh d'arrêter de faire cela et 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, faites-le :

autoreconf # ou ./autogen.sh si vous venez de le cloner pour la première fois

./configure

faire

faire installer

Après cela, vos sessions de clients mosh vérifiées par le CRIU survivront aux redémarrages.

(Évidemment, il faudrait é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).

29voto

007 Points 321

Je me rends compte qu'il s'agit d'un vieux post, mais il existe une solution très simple à ce problème, comme le suggère Keith Winstein, auteur de mosh, ici : https://github.com/mobile-shell/mosh/issues/394

"Eh bien, tout d'abord, si vous voulez avoir la possibilité de vous attacher à une session à partir de plusieurs clients (ou après la mort du client), vous devriez utiliser screen ou tmux. Mosh est un substitut (dans certains cas) de SSH, pas de screen. De nombreux utilisateurs de Mosh l'utilisent en même temps que screen et l'apprécient ainsi."

Scénario : Je suis connecté à un serveur distant via mosh. J'ai ensuite lancé screen et j'ai un processus en cours d'exécution dans la session screen, htop, par exemple. Je perds la connexion (la batterie de mon ordinateur portable est morte, je perds la connexion réseau, etc.) Je me reconnecte via mosh et j'obtiens ce message sur le serveur,

Mosh : Vous avez une session Mosh détachée sur ce serveur (mosh [XXXX]).

Tout ce que j'ai à faire est kill the prior mosh session

tuer XXXX

et se rattacher à la session d'écran, qui existe toujours .

écran -r

C'est particulièrement utile pour exécuter des mises à jour ou d'autres processus qui laisseraient le serveur dans un état désordonné et inconnu s'il était soudainement interrompu. Je suppose que vous pouvez faire la même chose avec tmux, bien que je ne l'aie pas essayé. Je crois que c'est ce qu'Annihilannic et eskhool suggéraient.

14voto

Alexander Burmak Points 121

En complément de la réponse de Varta, j'utilise la commande suivante pour fermer toutes les connexions mosh sauf celle en cours :

pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill

11voto

studgeek Points 4617

Comme @varta l'a souligné, les propriétaires de mosh sont très opposés au rattachement à partir de différents clients pour des raisons de sécurité. Donc, si votre client a disparu (par exemple, si vous avez redémarré votre ordinateur portable), votre seule option est de tuer les sessions.

Pour tuer uniquement les sessions détachées, vous pouvez utiliser la ligne suivante (que j'ai comme alias dans mon fichier .bashrc ).

who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill

Cette commande dépend du fait que who liste 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. Il trouve donc les pids des seules sessions mosh détachées et les passe à kill en utilisant xargs.

Voici un exemple who résultat 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 est d'utiliser la variable d'environnement mosh-server MOSH_SERVER_SIGNAL_TMOUT . Vous pouvez le fixer à quelque chose comme 300 dans votre système de gestion de l'information. .bashrc sur le côté serveur . Ensuite, si vous faites un pkill -SIGUSER1 mosh-server il ne tuera que les serveurs mosh qui n'ont pas été connectés dans les 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ée, elle me semble plus simple.

Notez, comme mentionné par @Annihilannic, que si vous utilisez tmux/screen à l'intérieur de vos sessions mosh, alors ces sessions tmux/screen sont toujours là après que vous ayez tué les sessions mosh. Vous pouvez donc toujours vous y attacher (vous ne perdez donc pas grand-chose à tuer les sessions mosh elles-mêmes).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X