Screen
SIGCHLD
信号を受信するたびにfifo / socketをチェックします。 ソケットが欠落している場合は、再作成されます。 したがって、解決策はプロセスを見つけて送信することSIGCHLD
です。
私のDebianシステムでは、setuidではなくscreen
setgidとしてインストールされているように見える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つのシェルを犠牲にして残りを保存します。何も機能しない場合は、失われた画面セッションで実行されているすべてのプロセスを削除することを忘れないでください。