1

我编写了一个 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
}

....

}

可能有几种情况我想暂停脚本。

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

我的猜测是,这将涉及一些操作系统 API 调用。

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

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

如果您需要更多详细信息以便找到解决方案,请告诉我。

谢谢。

4

1 回答 1

7

在等待读取时阻塞进程是非常标准的。当它被阻塞时,它不会收到任何 CPU 时间。除了 Perl 通常所做的之外,不需要任何操作系统调用。因此,只需发出提示“准备恢复时按 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更多适合您的口味。

于 2012-09-11T15:35:38.210 回答