デタッチされたmoshセッションに再接続するにはどうすればよいですか?


157

デタッチされたモッシュセッションに再接続する方法、またはそれ以外の方法で取り除く方法

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

つまり、モッシュに相当するものは何ですか

screen -D -R

または多分

screen -wipe

さらに、この答えはドキュメントのどこにありますか?

回答:


197

セキュリティ上の理由から、再接続できません。https://github.com/keithw/mosh/issues/394を参照してください

デタッチされたセッションを強制終了するには、そのメッセージに表示されているPID番号(「XXXX」の部分です)を使用します。たとえば、

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

そして、このコマンドを実行することができます:

kill 12345

また、すべてのモッシュ接続を閉じるには、次の方法があります。

kill `pidof mosh-server`

現在mosh経由で接続している場合、この最後のコマンドでも接続が切断されることに注意してください。


34
@artfulrobot切り離されたセッションがどこかにまだ生きているmoshクライアントに属している可能性があるためです。Moshセッションはローミングし、サスペンド/レジューム(たとえば、「ハイバネーション」)サイクルを通じて生き残ることができます。moshが解決しない(そして簡単にできない)問題は、クライアントマシンがmoshセッションを正常に閉じずに再起動したことを検出することです。
binki 2014年

7
killall mosh-server代わりにしない理由はありますか?特にpidofとkillallはとにかく本当に同じものなので。
ジョーダン

6
@ジョーダン:一部のシステム(Solarisなど)では、そのとおりkillall動作します。
追って通知があるまで一時停止。

4
moshで接続して実行killall mosh-serverすると、接続が切断されます。
0xcaff 2017年

1
@ 0xcaffモッシュで接続して実行しているkill `pidof mosh-server`場合は、同じように切り離されます
David

26

驚いたことに、私はCRIU(https://criu.org)を使用して、mosh クライアントをチェックポイントして再起動しました。

ショッキング。

mosh-clientのPIDを見つけます:

$ ps -ef | grep mosh

次に、指示に従ってCRIUをインストールします。

次に、次のようにチェックポイントします。

$ mkdirチェックポイント

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

次に、それを復元します。

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

そして、それがあります。あなたのモッシュクライアントが帰ってきました。

ただし、ノートパソコンが再起動した場合(これから保護しようとしていることの要点です)、moshはmonotonicクロックを使用してクライアント側の時間を追跡しますが、再起動後は機能しません。これは機能しませんが、ラップトップが完全にクラッシュすると、モッシュシーケンス番号がチェックポイントされたバージョンと同期しなくなるため、機能しません(バイナリは再開しますが、通信は停止します)。

これを修正するには、moshにそれを停止してmoshソースコードをダウンロードするように指示する必要があります。次に、このファイルを編集します。

CDモッシュ

vim configure.ac

次に、GETTIMEその行を検索してコメント化します。

次に行います:

autoreconf#または初めて複製した場合は./autogen.sh

。/構成、設定

作る

インストールする

その後、CRIUチェックポイントが設定されたmoshクライアントセッションは再起動後も存続します。

(明らかに、チェックポイントを定期的に実行できるように何かを書く必要があるでしょう。しかし、それは読者の練習問題です)。


1
復元後に画面の出力を更新するには、必ず「CTRL-L」を入力してください。
Michael Galaxy

6
まったくの好奇心から、私が見逃しているmoshクライアントセッションを復元することの実際的な利点はありますか?私はmoshでtmuxを実行し、クライアントでmoshを再起動してtmuxを再接続することができます...これを実行することの利点は、クールなもの(本当にそうです)以外にありますか?
eskhool 2016年

1
長い答え:github.com/mobile-shell/mosh/issues/394短い答えは、はい:mosh -serverデーモンがすでにターゲットサーバーで実行されている場合、tmuxセッションは必要ありません。ぶら下がっているモッシュデーモンが横にな​​っているだけでなく、最初に入力する必要のない別のキーストロークセットです。
Michael Galaxy

1
Moshは、スクリーンではなく、SSHの代替となる場合があります。 githubの上のquothがkeithw(モッシュ作者)
törzsmókus

19

これは古い投稿だと思いますが、モッシュの作者であるキース・ウィンスタインが提案しているように、これに対する非常に簡単な解決策があります:https : //github.com/mobile-shell/mosh/issues/394

「まず、複数のクライアントから(またはクライアントの終了後に)セッションに接続する機能が必要な場合は、screenまたはtmuxを使用する必要があります。Moshは(場合によっては)screenではなくSSHの代替です。多くのMoshユーザーは、画面と一緒にそれを使用し、そのようにそれを好きです。」

シナリオ:mosh経由でリモートサーバーにログインしています。次にscreenを実行して、スクリーンセッション(htopなど)でプロセスを実行します。接続が失われた(ラップトップのバッテリーが切れた、ネットワーク接続が失われたなど)。mosh経由で再度接続し、サーバーでそのメッセージを取得します。

Mosh:このサーバーにはMoshセッションがデタッチされています(mosh [XXXX])。

私がしなければならないすべては、前のモッシュセッションを殺すことです

XXXXを殺す

そして、まだ存在しているscreenセッションに再接続します

画面-r

これで、htop(または実行中のすべてのプロセス)が中断することなく元に戻りました。これは、突然中断された場合にサーバーを乱雑な不明な状態のままにするアップグレードまたはその他のプロセスを実行する場合に特に役立ちます。試したことはありませんが、tmuxでも同じことができると思います。私はこれがアニヒラン人とエスクールが示唆していたことだと信じています。


2
これは素晴らしい答えです。ありがとう。そうです、tmuxでも同じように機能することを確認しました。
laughing_man

10

Vartaの回答に加えて、次のコマンドを使用して、現在の接続を除くすべてのmosh接続を閉じます。

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


古いmoshセッションがない場合、xkillはエラーをスローします。使いpgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
やすさ

4

@vartaが指摘したように、moshの所有者は、セキュリティ上の理由から、さまざまなクライアントからの再接続に非常に反対しています。したがって、クライアントがなくなった場合(ラップトップを再起動した場合など)は、セッションを強制終了するしか選択肢がありません。

デタッチされたセッションのみを強制終了するには、次の行を使用できます(これは私ののエイリアスとして使用しています.bashrc)。

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

このコマンドは、whomoshセッションを含む接続ユーザーをリストし、接続されたmoshセッションのみが「via mosh」を持ち、moshセッションのpidが角括弧で囲まれているという事実に依存します。したがって、デタッチされたmoshセッションのpidを見つけ、xargsを使用してそれらをkillに渡します。

who参考のための結果の例を以下に示します。

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

代替方法は、mosh-server環境変数を使用することですMOSH_SERVER_SIGNAL_TMOUT。あなたは、あなたの中に300のようなものに設定することが可能.bashrc、サーバ側。次に、これを行うpkill -SIGUSER1 mosh-serverと、最後の300秒間接続されていないmosh-serverのみが強制終了されます(他のサーバーはSIGUSER1を無視します)。詳細については、mosh-serverのmanページをご覧ください。上記のコマンドを使用しているのは、エイリアスを設定すると簡単に見えるからです。

@Annihilannicで言及されているように、moshセッション内でtmux / screenを使用している場合、moshセッションを終了した後も、それらのtmux / screenセッションはまだ残っています。したがって、それらにアタッチすることができます(したがって、moshセッション自体を強制終了しても、それほど多くのデータを失うことはありません)。


3

殺すことmosh-serverが唯一のオプションであると主張するここでの答えは、任意のプロセスを使用criureptyrて回復および再接続するために使用できるため、ほとんど時代遅れです。

言うまでもなく、現在、kill -USR1 mosh-server切り離されたセッションを強制終了できるのは、安全でないwho出力や面倒なコマンドに頼らずに、自分のセッションを強制終了しないようにしてください。

criuMichael R. Hinesからの回答の隣に、reptyr開始されたプロセスmosh-server(つまり、mosh-serverそれ自体ではない)を再接続するために使用できる、やや「軽量」なものがあります。私は通常使用します

pstree -p <mosh-server PID>

切り離されたmosh-serverの下のプロセスのツリーをリストし、次に

reptyr PID

現在の端末に目的のプロセスを再アタッチします。気になるすべてのプロセスについて手順を繰り返した後、私は

kill -USR1 <mosh-server PID>

一方、私が知っているセッションのみを殺すように注意します(共有システム)。


私は得るUnable to attach to pid 10103: Permission denied
rubo77 '11 / 11/19

-1

実行中のタスクのリストを取得するには、psコマンドを使用するか、 ps -ef | grep mosh

次のコマンドを使用して、mosh PIDを強制終了します。

kill <pid>

また、すべてのモッシュ接続を閉じるには、次の方法があります。

現在mosh経由で接続している場合は、これにより切断されます。

kill `pidof mosh-server`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.