2013-10-10 54 views
1

我有一个IRC bot以Perl语言编写,使用过时的,无证的和不喜欢的Net :: IRC库。尽管如此,它运行得很好......除非连接断开。似乎图书馆在实施重新连接支持之前不再更新。显而易见的解决方案是重写整个机器人以利用库的后继者,但不幸的是需要重写整个机器人。如何为Net :: IRC机器人设置互联网连接检测器?

所以我感兴趣的解决方法。

当前的设置我已经是supervisord配置每当进程意外退出重启机器人,和cron作业杀每当互联网连接丢失的过程。

这不起作用,因为我似乎无法正常工作,因为机器人似乎无法检测到因互联网中断而丢失了连接。它会继续愉快地继续运行,无所事事,假装仍然连接到IRC服务器。

我有以下代码为主体的程序循环:

while (1) { 
    $irc->do_one_loop; 
    # can add stuff here 
} 

我想它做的是:
一)检测,互联网已经下降,
B)等到互联网已经涨了,
C)退出脚本,使supervisord可以复活它。

是否有这样做的任何其他更好的方法?

编辑:在脚本方法不起作用,原因不明。我正在尝试制作一个单独的脚本来解决它。

#!/usr/bin/perl 

use Net::Ping::External; 

while (1) { 
    while (Net::Ping::External::ping(host => "8.8.8.8")) { sleep 5; } 

    sleep 5 until Net::Ping::External::ping(host => "8.8.8.8"); 
    system("sudo kill `pgrep -f 'perl painbot.pl'`"); 
} 

回答

1

假设do_one_loop不会挂(可能需要添加一些alarm如果这样做),你需要主动轮询的事情告诉网络是否是向上。像这样的东西应该能够在故障发生后每隔5秒钟进行一次ping操作,直到获得响应,然后退出。

use Net::Ping::External; 
sub connectionCheck { 
    return if Net::Ping::External::ping(host => "8.8.8.8"); 

    sleep 5 until Net::Ping::External::ping(host => "8.8.8.8"); 
    exit; 
} 

编辑: 由于do_one_loop似乎挂,你需要一些方法来环绕它的超时。时间的长短取决于你期望它运行多久,以及如果它没有响应,你愿意等待多久。一个简单的方法来做到这一点是使用alarm(假设你是不是在Windows上):

local $SIG{'ALRM'} = sub { die "Timeout" }; 
alarm 30; # 30 seconds 
eval { 
    $irc->do_one_loop; 
    alarm 0; 
}; 
+0

似乎的确do_one_loop挂起 - 我怎么使用'警报“悬空它?这不是我的职能之一,它来自图书馆。 –

+0

我试过这个,就像http://pastie.org/8396134一样,但没有采取。也许我可以把它放在一个单独的脚本中,而不是通过系统调用来杀死僵尸程序? –

+0

听起来像一个计划 – AKHolland

1

Net::IRC主循环有超时和安排的活动的支持。

尝试是这样的(我没有测试它,因为我上次使用的模块,它已经7年...):

# connect to IRC, add event handlers, etc. 
$time_of_last_ping = $time_of_last_pong = time; 
$irc->timeout(30); 
# Can't handle PONG in Net::IRC (!), so handle "No origin specified" error 
# (this may not work for you; you may rather do this some other way) 
$conn->add_handler(409, sub { $time_of_last_pong = time }); 
while (1) { 
    $irc->do_one_loop; 
    # check internet connection: send PING to server 
    if (time-$time_of_last_ping > 30) { 
     $conn->sl("PING"); # Should be "PING anything" 
     $time_of_last_ping = time; 
    } 
    break if time-$time_of_last_pong > 90; 
} 
+0

为什么它不适合我? –