ドロップされたSSHセッションで実行されているコマンドを再開する


32

この質問を読んで不思議に思いました。仮定screenは使用されていません。何らかの理由でLinuxターゲット上のSSHセッションがドロップされ、タイムアウトのためにサーバーがセッションを強制終了する前に再接続した場合、実行中のコマンドの制御を取り戻し、セッションが中断されて中止されないようにすることは可能ですか? ?


それはどんなコマンドですか?一般的に答えはノーだと思います。
-davr

特定のコマンドはありませんが、私は単に一般的な概念として尋ねています。
ジョンガーデニア

1
ttyセッションがどのように初期化されるかについて包括的な理解を持っている人は、その方法を教えてくれるかもしれません。同じttyで新しいセッションを再作成し、以前のPPIDを明示的に割り当てることができたようです。ひげを生やしたnix guruがやって来て私たちの心を吹き飛ばすのを待っています。それはとにかく夢です。
CarpeNoctem

テザー接続されたラップトップを試して、イーサネットコードを抜くとどうなりますか?
ポール

@〜drpaulbrewer-デスクトップマシンで行う場合とまったく同じ-接続が切断されます。接続の切断方法は、質問とは無関係です。
ジョンガーデニアス

回答:


13

新しい端末の現在のSTD *ファイル記述子を古い実行中のプロセスに接続しようとすると、トラブルが発生します。たとえそれをやっても、端末のジョブ制御は期待どおりに機能しません。最終的に引き継がれたプログラムを終了すると混乱が残り、ファイル記述子を犠牲にして新たにバックグラウンド化されたプロセスに渡されるシェルはどうなりますか。そのシェルがなくなると、sshは開いたままになりますか?おそらくない。したがって、最初に別の場所にリダイレクトする必要があります。

可能かどうかに関係なく、放棄されたプロセスを「自然に」強制終了させる方が望ましいと思います。あなたが何か重要な十分にやっている場合は、すべてのハックをしようと正当化制御を再開するために必要なためにあなたが不安定なリンクにしている、あなたはおそらく、事前だけ利用画面(またはVNCでいることを知っているべきか、何があなたdetached-を浮かびますコントロールボート)。:)


私は受け入れる答えを選ぶのが難しいと思っているので、この時点でそれが唯一の賛成票を持っているので、私はこれを受け入れています。
ジョンガーデニアス

5

私はこれが古い質問であることを知っていますが、他の誰かが私と同じようにこれに出くわした場合に備えて、私の調査結果を追加することが重要だと感じました。

はい、これを行うことに異常な結果は見ていませんが、これは私が使用したものであり、驚くほど機能しました。サーバー上で長いプロセスを実行すると、sshセッションが切断されることがあります。プロセスとttyセッションは実行されたままになりますが、再接続できません。プロセスを新しく接続されたセッションにプルする以下のプログラムを見つけました。

https://github.com/nelhage/reptyr

詳細はこちら

https://blog.nelhage.com/2011/02/changing-ctty/


5
サーバー障害へようこそ!これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
EEAA 14

ありがとう、@ user215086!驚くべきことに、これはうまくいきました!長い設定ファイルをしばらく編集していたので、たくさんのカスタム設定と慎重に書かれたコメントを追加しましたが、接続が切れるとほぼ終了しました!「Noooooo !! ...」天井で冒とくを叫んだ後、レプティルをインストールしました。sshセッションをエディター内に置いたままに復元し、いくつかの作業を終えて、保存して完了しました!! ウーフー!レプティルは素晴らしいです。
ColdCold

4

一般的に、これを処理する正しい方法は、GNU screenまたはbash nohupまたはdisownメカニズムを使用して事前に準備することです。を使用しているtcsh場合、シェルは異常終了するとバックグラウンドジョブを無視します。

使用してscreenいないが、disownメソッドの1つを使用してプロセスを実行し続けている場合、gdbsource)を使用してプロセスへの再接続を偽装できる可能性があります。

[...]いくつかの汚いハッキングでは、プロセスのstdout / stderr / stdinを再び開くことは不可能ではありません。[...]

次に、gdbを使用してプロセスにアタッチし、close(0)
call close(1)
call close(2)
call open( "/ dev / pts / xx"、...)
call dup(0)を呼び出します。
call dup(0)
detach

ここで、状況に応じてこのプロセスを調整する必要があります。プロセスを否認することができなかったら助けになるとは思いません。あなたが使用している場合はbashこの記事を参照することについてはbash自動的に勘当(基本的には、オフ終了時にバックグラウンド・プロセスをhuponexitshoptを)。フォアグラウンドプロセスでは、nohupを使用する必要があります。


1

おそらくない。私はそれが不可能であることを保証することはできませんが、私は本当にそれを疑います。

一つのことは、ssh接続の終了の結果として実行されているシェルとコマンドの強制終了の欠如です。これはそれほど難しくありません。他の質問で述べたようなnohupや同様のメカニズムを使用できるはずです。

しかし、その後、開始ssh somehost nuhup vim /some/fileして接続が切断されたと仮定します。ssh somehost再度ログインして実行すると、vimプロセスがまだ実行されていることがわかります。しかし、そのプロセスに再び接続する方法を教えてください。インタラクティブなフォアグラウンドプロセスには制御ttyがあり、vimプロセスの開始時に開かれたttyはそれ以降閉じられていました。新しいシェルで再び「再開」する方法があるかどうかはわかりません(1つのシェルで複数のバックグラウンドジョブが実行されているように、別のシェルでそれらをフォアグラウンドにすることはできません)。

Screenこの機能を持つように明示的に記述されています。起動時に、端末管理プロセスとクライアントプロセスの2つのプロセスをフォークします。相互作用はクライアント<->ターミナルマネージャー<->アプリケーションであり、接続を切断または切断すると、ターミナルマネージャーが存続している間にクライアントプロセスが終了します。画面には、後で端末管理プロセスにアタッチする特定のサポートがありますが、これは一般的なケースでは不可能だと思います。


ありがとう。それはほとんど私が期待したことです。誰かが間違っていることを証明できるかどうか見てみましょう。;)
ジョンガーデニアーズ

この回答を書いて以来、「再入力」プロセスにはプログラムのレプティルがあることを学びました。理論的には実行可能ですが、全体的な答えはおそらくそうではないと思います。
hlovdal


1

セッションがドロップされた場合、TTLがすでに期限切れになっていることを意味するため、これ以上のttyはありません(理解できます)。ただし、ネットワーク接続が中断された場合、SSHセッションを停止する必要はないため、接続を再開して続行できるはずです。それはあなたが尋ねていることですか?


私は一般的に尋ねていましたが、ネットワークの問題が原因で接続が切断される原因に最も興味があります。全体的に見て、見栄えはあまり良くないと思います。それでも、これは必要ではなく、好奇心からのみ求められました。あなたがそれを必要とする前に答えを知ることは常に素晴らしいことです。;)
ジョンガーデニアーズ

切断された接続は、単純な概念ではないようです。あなたはそれのいくつかの異なる段階を経験するかもしれません。たとえば、ネットワークケーブルを取り外して、数秒で接続し直すと、SSHセッションが維持され、最初の短い遅延が発生しても、再接続する必要はありません。強制終了されたsshセッションがある場合は、何かが誤って構成されている(または、この種の中断をサポートするように適切に構成されていない)ことを意味します。
単神話

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