[Moscow.pm] check Socket Alive
Kaltashkin Eugene
zhecka на gmail.com
Пт Ноя 20 00:58:18 PST 2009
Доброе время суток.
Помню где-то пролетало, но найти не могу.
Есть Unix Socket Client который дёргает данные из другого процесса.
Иногда слушающий процесс падает. Соответственно падает клиент.
Как бы сделать чтобы клиент не падал ?
Пытаться заново создать клиента к сокету ?
Понятное дело, что нужно что-то сделать в local $SIG{ALRM}, но вот что ?
Схема вот такая.
my $client = IO::Socket::UNIX->new( Peer => $socketfile,
Type => SOCK_STREAM ) or
die $!;
print $client $string;
eval {
local $SIG{ALRM} = sub { die "alarm time out" };
alarm 2;
my $lens = sysread($client,$line,1024);
......
alarm 0;
return "$catnumlist $categlist\n";
1; # return value from eval on normalcy
} or die "recv from socket fail after 2 seconds.\n";
Что лучше сделать ? Это поточный демон(аналог socat), снимающий запросы
с UDP и перенаправляющий на UnixSocket, и потом обратно.
Поток доходит до 200 запросов в секунду. Слушающий UDP сокет работает
через IO::Multiplex.
Подскажите плз кто похожие схемы делал.
Подробная информация о списке рассылки Moscow-pm