web-dev-qa-db-fra.com

Comment puis-je me rattacher à une session de mosh détachée?

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?

145
John Baber-Lucero

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.

177
varta

À 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).

21
Michael R. Hines

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.

14
007

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

8
Alexander Burmak

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).

4
studgeek

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é).

1
Irfy

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`
0
Pankaj Chauhan