2008/09/14(Sun)screenでデタッチできない 解決編
2008/09/14 21:21
デタッチできないというよりも、むしろアタッチできないという方が正しい表現だったようだ。
これはscreenの問題ではなく、回線が切れたときにsshセッションが切れず、sshdプロセスが生きたままで、その応答待ちでscreenがattachedから変化しない模様。
以下、対処法。
$ ps x | grep pts | grep sshd 13819 ? S 0:00 sshd: kero@pts/2 13985 ? S 0:00 sshd: kero@pts/8 14595 pts/2 S+ 0:00 grep sshd grepが走っているpts/2が現在操作中のポートなので、pts/8を落とす。 $ kill -KILL 13985 $ screen -ls There is a screen on: 9120.pts-0.spinel (Multi, detached) 1 Socket in /var/run/screen/S-kero. $ screen -rこれで自動的にdetatchされ(autodetatchがonの場合)再アタッチ可能になる。
が、いちいちこんな事やるのが面倒なので、自分以外のsshセッションを片っ端から強制終了するスクリプトを書いてみた。
最近Perlの正規表現にハマってたりなので…。/bin/sh+sedかawk…と思いつつも、慣れてる方が書きやすい。
screenの内側から実行しないように注意。
#!/usr/bin/perl use strict; (my $tty = `echo -n \$SSH_TTY`) =~ s/\/dev\///; my $dead = `ps x | grep pts | grep sshd | grep -v $tty | grep -v grep`; foreach(split(/\n/, $dead)){ $_ =~ s/^\s*(\d+).+$/$1/; print qq|Kill pid=$_...\n|; `kill -KILL $_`; }
参考元:http://subtech.g.hatena.ne.jp/cho45/20070517/1179373075