切断後にシェルを回復する方法


37

リモートCentOS 5.6マシンでいくつかの作業を行っていますが、私のネットワークはドロップし続けます。再接続後にハングしたセッションを回復する方法はありますか?

編集:yumでいくつかのアップデートとインストールを行っており、プロセスが何をしていてもハングしている場合、これが問題になるかもしれないと心配しています。


6
tmuxまたは画面。
sehe

回答:


63

方法はありませんが、これを防ぐにはを使用するのが好きtmuxです。tmuxを起動し、操作を開始して、そのまま進みます。戻って接続が切断されたことがわかった場合は、再接続してを入力するだけtmux attachです。

以下に例を示します。

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion

tmuxを持ってはいけません。また、

5
@sergio私の心が出血する:-))を使用しscreenます。

4
@sergio Unixシステムでは、実行するのにルート権限を必要としない実質的にすべてのアプリケーションを1つのホームディレクトリにインストールできます。
クサラナナンダ

35

tmuxとscreenの推奨事項は両方とも良い提案です。彼らはあなたの質問に対する答えを暗示していますが、実際にはそれを述べていません。質問に対する答えは、「方法はありません」です。ssh経由でログインした場合、接続が切断されるとシェルは終了します。回避策は、ログインして、何らかの種類の仮想端末(などtmux)をすぐに起動することです。接続が切断されると、現在いるシェルは終了しますが、新しいシェルを開いて仮想端末(実際に作業をしているシェルを実行している)に再接続できます。


OK。その明確な今。

仮定すると、yumのプロセスがまだ実行されます(シェルがSIGHUPを得たときに、すぐに終了しませんでした)、reptyrまたは類似の可能性があるプロセスを回復するのに十分であるか、または任意の将来の出力を得るthat-- --failing。ただし、通常、シェルは切断時に終了します。
エローエン

@Eroen tmuxを使用していても、接続が失われたことが検出されると、OSはtmuxプロセスを終了しますか?
道場

@Dojo接続が終了すると、tmuxインスタンスは停止しますが、tmuxセッション(およびそれが管理するシェル)は稼働し続けます。
ウィリアムパーセル

たとえば、ユーザーが突然RJ-45ケーブルを抜いたためにリモートsshサーバーへの接続が失われた場合、sshサーバーは事前に定義されたタイムアウト(120秒など)までこのセッションを保持していると思います。したがって、この場合、ケーブルが抜かれた後120秒以内にsshサーバー側でまだ生きているこのセッションを再開する方法はありますか?
ギャブは好人

8

ウィリアムが言ったように、短い答えはノーです、方法はありません。これを防ぐには、接続を失う前にscreenコマンドを使用できます


私が理解していることから、私はスクリーンでyumを開始しなければならなかったでしょう...まあ、私はしませんでした。私はそれがまだ使用されていると言ってyumを再実行することはできません。私はそれを強制的に殺したくありません。..実行中のyumの制御を取り戻すにはどうすればよいですか?

そして屏風は、それが自動的に素敵なグラフィカルターミナルに発売を取得するには、画面に素敵な補完、あるlaunchpad.net/byobu

私が知る限り、yumコマンドからの出力を現在の用語セッションにリダイレクトする隠された方法がない限り、あなたができないことを知っていますが、私の頭の上のものを考えることはできません。
ニコラススミス

これには、デバッガーとcを使用した部分的な解決策がいくつかあります。プロセスに新しい親シェルを与える。Reptyrはその1つであり、ブログ投稿で問題、回避策、およびその他の実装について説明しています。
エローエン

3

いいえ、切断後にシェルを回復することはできません。代わりにできることは、実行していたコマンドが切断後も引き続き実行されるようにすることです。

これを実現するには、「nohup」コマンドと「disown」コマンドを使用します。これらのコマンドは通常、ほとんどのシェルの組み込みコマンドです。つまり、何もインストールする必要はありません。ただし、これは非対話型コマンドでのみ機能します。

したがって、手順は次のようになります。

  1. サーバーにログイン
  2. コマンド「nohup sudo yum update&」を実行します(これにより、すべての出力が現在のディレクトリのnohup.outファイルに記録されます)
  3. 「disown%1」を実行します
  4. この時点で気軽に切断するか、切断されるのを待ってください:)

サーバーに戻ったら、単に「tail nohup.out」と入力して、コマンドの実行状況を確認します。


一般的な場合、これはかなりうまくいかないでしょうか?たとえば、ある時点で入力を必要とするコマンドの場合...完全に非対話型のコマンドの場合は、十分に機能し、ターミナルマルチプレクサのオーバーヘッド(および場合によってはインストールが必要)を回避できます。
CVn

はい、これはコマンドがユーザー入力を必要としない場合にのみ機能します。答えを更新しました。全体としてターミナルマルチプレクサーが確実に機能しますが、追加のツールをインストールすることは許可されていないことに言及しました。
ザイギス

絶対に、それは有効な答えであり、可能なユースケースではわずかに制限されています。編集に賛成しました。
CVn

3

誰かが答えではなくコメントにレプティルを追加したので、私はそれを支持することはできませんが、編集された質問に対する良い答えのようで、CentOSでうまく機能しました。

参照:https : //github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

再接続後にハングしたセッションを回復する方法はありますか?

編集:yumでいくつかのアップデートとインストールを行っており、プロセスが何をしていてもハングしている場合、これが問題になるかもしれないと心配しています。

同じことで、yum updateセッションへのリモート接続を失いました。だから私はこの質問を検索して見つけました...そして今度は再接続してスクリーンを使用しました:

  1. SSHを再接続する
  2. 画面
  3. 上記のリンクに従ってreptyrをインストールします
  4. ps -a | グレップヤム
  5. レプティルpsid

そこには、yumが数時間前に与えていた回復されたプロンプトがあります。

技術的には答えはすべて正しいです。これはハングしたセッションの回復ではなく、孤立したプロセスの現在のセッションへの親子化です。とても便利です...


1

多くの人が示唆screenしているようにtmux、どちらも基本的な機能をサポートしていますが、明確な特定の機能を持っているため、すべての場合において他の人より優れているとは言えません。たとえば、Window-splittingをサポートしているのはtmux のみですが、GNU画面のみが(Ctrl + ar)で長い行の折り返しを切り替えることができます。詳細な比較はこちらをご覧ください。

sshのこの問題を修正するためのツールもあります。

Autosshは、sshのコピーを開始して監視し、必要に応じて停止したり、トラフィックの通過を停止したりするプログラムです。アイデアはrstunnelからのものです。

Moshは、ローミングを可能にし、断続的な接続をサポートし、ユーザーのキーストロークのインテリジェントなローカルエコーとライン編集を提供するリモートターミナルアプリケーションです。MoshはSSHの代替品です。特にWi-Fi、セルラー、および長距離リンクを介した、より堅牢で応答性に優れています。


-1

これは、tmuxシェルを使用して実行できます。切断された場合、セッションを再接続する最も速い方法は次のとおりです。

tmux a #0

これは、受け入れられた答えが言っていないことを何も追加しません。また、ユーザーがすでにtmuxセッションを実行していることを前提としています。
クサラナンダ

2
これは、「あなたは省略することができますと言ってその答えにコメントすることができattacha」。
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.