ようこそゲストさん

Kerosoft : Modus Operandi

2008/09/14(Sun) screenでデタッチできない 解決編

はてブ情報 はてブに登録 はてブ数 2008/09/14 21:21 Software::Linux
screenでデタッチできないというのを書いたが、解決法発見。
デタッチできないというよりも、むしろアタッチできないという方が正しい表現だったようだ。

これは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…と思いつつも、慣れてる方が書きやすい。
だいたい検証したけど、killのとこだけは検証してない…。たぶん大丈夫。ちゃんと動きました。
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
参考になった記事や興味深かった記事は、他の人も見つけやすいようにリンクはてブしていただけると助かります…。 コメントも歓迎です。

名前:  非公開コメント   

  • TB-URL  http://mo.kerosoft.com/068/tb/