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