私はリモートの Debian Jessie サーバーで作業しています。スクリーン セッションを開始し、スクリプトの実行を開始したところ、ネットワーク タイムアウトによって切断されました。
今、再度ログインしてセッションを再開したいと思います。
画面を一覧表示すると、次のようになります。
$ screen -ls
There are screens on:
30608.pts-8.myserver (11/03/2015 08:47:58 AM) (Attached)
21168.pts-0.myserver (11/03/2015 05:29:24 AM) (Attached)
7006.pts-4.myserver (10/23/2015 09:05:45 AM) (Detached)
18228.pts-4.myserver (10/21/2015 07:50:49 AM) (Detached)
17849.pts-0.myserver (10/21/2015 07:43:53 AM) (Detached)
5 Sockets in /var/run/screen/S-me.
まるで2つの画面に同時に接続しているようです。
ここで、以前実行していたセッションを再開して、スクリプトの結果を確認します。
$ screen -r 30608.pts-8.myserver
There is a screen on:
30608.pts-8.OpenPrescribing (11/03/2015 08:47:58 AM) (Attached)
There is no screen to be resumed matching 30608.pts-8.myserver.
なぜ再接続できないのですか?
他の画面でも同じ問題が発生します:
$ screen -r 21168.pts-0.myserver
There is a screen on:
21168.pts-0.OpenPrescribing (11/03/2015 05:29:24 AM) (Attached)
There is no screen to be resumed matching 21168.pts-0.myserver.
答え1
セッションは別の端末にまだ接続されています。サーバーは、その接続でネットワークの停止を検出していません。サーバーは、パケットを送信しようとしてエラーが返されたとき、またはタイムアウト後に応答がないときにのみ停止を検出しますが、これはまだ発生していません。クライアントが入力を送信しようとして失敗したために停止を検出したが、サーバーは入力を待っているという一般的な状況です。最終的に、サーバーはキープアライブ パケットを送信し、接続が切断されたことを検出します。
その間、-d
screen セッションをそれが存在するターミナルから切り離すオプションを使用します。
screen -r -d 30608
screen -rd
これは、既存のスクリーン セッションに接続するための標準的な方法です。
答え2
によるマニュアル「再開」できるのは独立した画面:
'
-ls
[マッチ]'
'-list
[マッチ]'
screen を起動せず、代わりにセッション識別文字列のリストを出力します (通常は pid.tty.host の形式です。セッション名を参照してください)。「分離」とマークされたセッションは、screen -r
. 「接続済み」とマークされているセッションは実行中で、制御端末を持っています。セッションがマルチユーザー モードで実行されている場合は、「マルチ」とマークされます。「到達不能」とマークされているセッションは、別のホストで実行中であるか、またはデッド状態です。到達不能セッションは、その名前がローカル ホストの名前または指定されたパラメータ (ある場合) のいずれかに一致する場合、デッド状態であるとみなさ-r
れます。一致の構築方法については、フラグを参照してください。「デッド」とマークされているセッションは、徹底的にチェックして削除する必要があります。不明な場合は、システム管理者に問い合わせてください。セッションを削除するには、「-wipe
」オプションを使用します。
必要なのは次のオプションです:
'
-x
'
すでに他の場所で接続されているセッションに接続します (マルチディスプレイ モード)。画面は、それ自体からの接続を拒否します。ただし、複数の画面をカスケード接続する場合、ループは検出されません。注意してください。
答え3
screen
オプションでを添付します-rD
。
マニュアルを参照してください:
-D -r
Reattach a session. If necessary detach and logout remotely first.
答え4
私が知っている方法は 2 つあります。
- screen -rd <スクリーン名/ID>
これにより、画面が切り離され、再度接続されます。事前に接続されていたユーザーの画面は閉じられます。
- screen -x <スクリーン名/ID>
これにより、接続中のユーザーを終了せずに、画面に直接接続できます。これは主に、マルチユーザー ディスプレイで使用されます。