デタッチされたモッシュセッションに再接続する方法、またはそれ以外の方法で取り除く方法
Mosh: You have a detached Mosh session on this server (mosh [XXXX]).
つまり、モッシュに相当するものは何ですか
screen -D -R
または多分
screen -wipe
さらに、この答えはドキュメントのどこにありますか?
デタッチされたモッシュセッションに再接続する方法、またはそれ以外の方法で取り除く方法
Mosh: You have a detached Mosh session on this server (mosh [XXXX]).
つまり、モッシュに相当するものは何ですか
screen -D -R
または多分
screen -wipe
さらに、この答えはドキュメントのどこにありますか?
回答:
セキュリティ上の理由から、再接続できません。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経由で接続している場合、この最後のコマンドでも接続が切断されることに注意してください。
killall mosh-server
代わりにしない理由はありますか?特にpidofとkillallはとにかく本当に同じものなので。
killall
動作します。
killall mosh-server
すると、接続が切断されます。
kill `pidof mosh-server`
場合は、同じように切り離されます
驚いたことに、私は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クライアントセッションは再起動後も存続します。
(明らかに、チェックポイントを定期的に実行できるように何かを書く必要があるでしょう。しかし、それは読者の練習問題です)。
これは古い投稿だと思いますが、モッシュの作者であるキース・ウィンスタインが提案しているように、これに対する非常に簡単な解決策があります: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でも同じことができると思います。私はこれがアニヒラン人とエスクールが示唆していたことだと信じています。
Vartaの回答に加えて、次のコマンドを使用して、現在の接続を除くすべてのmosh接続を閉じます。
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
@vartaが指摘したように、moshの所有者は、セキュリティ上の理由から、さまざまなクライアントからの再接続に非常に反対しています。したがって、クライアントがなくなった場合(ラップトップを再起動した場合など)は、セッションを強制終了するしか選択肢がありません。
デタッチされたセッションのみを強制終了するには、次の行を使用できます(これは私ののエイリアスとして使用しています.bashrc
)。
who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill
このコマンドは、who
moshセッションを含む接続ユーザーをリストし、接続された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セッション自体を強制終了しても、それほど多くのデータを失うことはありません)。
殺すことmosh-server
が唯一のオプションであると主張するここでの答えは、任意のプロセスを使用criu
しreptyr
て回復および再接続するために使用できるため、ほとんど時代遅れです。
言うまでもなく、現在、kill -USR1 mosh-server
切り離されたセッションを強制終了できるのは、安全でないwho
出力や面倒なコマンドに頼らずに、自分のセッションを強制終了しないようにしてください。
criu
Michael 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
実行中のタスクのリストを取得するには、psコマンドを使用するか、 ps -ef | grep mosh
次のコマンドを使用して、mosh PIDを強制終了します。
kill <pid>
また、すべてのモッシュ接続を閉じるには、次の方法があります。
現在mosh経由で接続している場合は、これにより切断されます。
kill `pidof mosh-server`