web-dev-qa-db-ja.com

失われた画面(切り離された、欠落したソケット)に再接続するにはどうすればよいですか?

ホームサーバーでscreenセッションを実行しました。ワークステーションで再起動が必要なため、ターミナルを切り離して強制終了しました。サーバーに再接続すると、通常の

$ screen -D -R
[new screen]

えっ?いいえ、新しいセッションではなく、古いセッションをやめます。私はそれを直接つかむつもりです。ソケット名は何ですか?

$ screen -list
No Sockets found in /var/run/screen/S-username

$ ls -a /var/run/screen/S-username
.  ..

待って...何?私はそれを実行したままにしたことを知っています。どこに行くの?

$ ps -ef | grep -i screen
username  30860     1  0 Oct16 ?        00:00:29 SCREEN

まあ、プロセスがあります。ただし、screen -rに渡すソケットはありません。セッションに再接続するにはどうすればよいですか?

23
quack quixote

Screenは、SIGCHLD信号を受信するたびにfifo /ソケットをチェックします。 ソケットがない場合は再作成されます。したがって、解決策はプロセスを見つけてSIGCHLDを送信することです。

私のDebianシステムでは、screenはsetgid utmpとしてインストールされているように見えますが、setuidではないため、以下のFAQ)の最初の解決策が機能しました:

$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost

Screenがインストールされているシステムでは、setuid rootは機能しません。アクティブなスクリーンセッションの子プロセスの1つを強制終了して、カーネルに強制的にシグナルを送信させる必要があります。これは、画面ウィンドウの1つを犠牲にして残りのウィンドウと再接続することを意味します(賢く選択してください)。

アーカイブされたGentoo Wiki FAQ から:

ソケットがありません

実際のプロセスとそのすべての子プロセスはまだ実行中ですが、実行中の画面のソケットが破壊されることがあります。 screen -listを実行すると、「/ tmp/uscreens/..にソケットが見つかりません。」と表示されます http://www4.informatik.uni- erlangen.de/~jnweiger/screen-faq.html#MISC 下の約2/3。

Q:不明な理由により、/ tmp/screens/S-mynameのfifoがなくなり、スクリーンセッションを再開できません。 fifoを再現する方法はありますか?

A:画面は、SIGCHLD信号を受信するたびにfifo /ソケットをチェックします。欠落している場合は、fifo /ソケットが再作成されます。

画面がset-uid以外で実行されている場合、ユーザーはkill -CHLD screenpidを直接発行できます(一部のシステムでは-CHILDです)。 Screenpidは、ps -xリストにある画面プロセスのプロセスIDです。

ただし、画面はsetuid rootでインストールする必要があるため、通常これは機能しません。この場合、シグナルを送信することはできませんが、カーネルは送信します。 screenの子がその状態を変更するときはいつでもそうします。画面内で実行されている「最も重要でない」シェルのプロセスID(下記のシェルピッド)を見つけます。お試しkill -STOP shellpid。 fifo/socketが再表示されない場合は、シェルプロセスを破棄してください。 1つのシェルを犠牲にして残りを保存します。何も機能しない場合は、失われた画面セッションで実行されているすべてのプロセスを削除することを忘れないでください。

28
quack quixote