我编写了一个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脚本中自动执行此操作。
如果您需要更多详细信息,请与我们联系,以便找到解决方案。
感谢。
答案 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
更符合您的口味。