根据条件暂停和恢复Perl脚本

时间:2012-09-11 14:49:08

标签: perl

我编写了一个Perl脚本,它逐个连接到一组URL。每次连接到URL时,它都会获取结果并对其执行一些操作。

但是,有一些可能发生错误的可能性。

我想解决的最重要的问题是可用性问题。 Internet连接可能会停止工作。所以,假设我有一个包含1000个URL的列表,该脚本已经成功完成了500个,然后Internet停止工作,结果脚本中止并出现错误。我想控制这种情况并在此处实现暂停和恢复功能。

几行代码解释:

$mech=WWW::Mechanize->new();
$mech->timeout(10);

$url="http://example.com/index.php?id=";

while(<INPUT>)
{
chomp $_;
$word=$_;
$url=$url.$word;
eval{$mech->get($url);};

if($@)
{
  # Pause the Script once the if condition evaluates to true
}

....

}

我可能想要暂停脚本的几个条件。

所以,我知道我需要将某种信号传递给脚本,这会导致它暂停。同时,应该为最终用户提供功能,最终用户可以按“某些组合键”来恢复脚本。

我的猜测是,这将涉及一些OS API调用。

在Linux上,有一种方法可以通过按Ctrl + Z组合键暂停进程。

但是,我不确定如何在Perl脚本中自动执行此操作。

如果您需要更多详细信息,请与我们联系,以便找到解决方案。

感谢。

1 个答案:

答案 0 :(得分:7)

在等待读取时阻止进程是非常标准的。虽然它被阻止,但它不会收到任何CPU时间。在Perl通常不需要的情况下,不需要OS调用。所以只需发出提示“准备好恢复时按Enter键,然后阅读STDIN

Blocked-on-IO是标准,是操作系统进程表的状态。最近,我在Perl中编写了一个套接字测试脚本,作为一个虚拟服务器。一天晚上我匆匆离开,早上在我的虚拟服务器终端上发现“等待3371端口......”提示。好几个星期都会这样。

因此,您可以将整个事物包装在标记的 IO循环中,而不是像使用循环控件那样使用循环控制:

BIT_OF_WORK:
while ( $more_work ) { 
    ALL_GOOD:
    while ( $all_good ) {
       ...
       my $socket = open_socket() or last ALL_GOOD;
       ...
       last BIT_OF_WORK unless ( $more_work = @queue );
       ...
    }
    say 'Detected Network Down. Press Enter to continue';
    my $user_input = <STDIN>;
}
say 'Phew, that was a lot of work!';

您甚至可能会发现redo更符合您的口味。