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


23

私が持っていた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。セッションに再接続するにはどうすればよいですか?

回答:


28

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

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

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

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

以下からのアーカイブのGentoo Wikiのよくある質問

ソケットがありません

実際のプロセスとそのすべての子プロセスはまだ実行中ですが、まだ実行中の画面のソケットが破壊される場合があります。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 / socketをチェックします。欠落している場合、fifo / socketは再作成されます。

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

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

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