问题描述
我的 Perl 脚本
while (blah)
{
system ("wget $blah");
}
当我 ctrl-c 时不会死。相反,子进程 wget
死亡,while 循环继续。
父 Perl 进程如何检测到并终止?
解决方法
检查system的返回值:
0 == system "wget $blah" or die "Can't get $blah.";
,
我更喜欢 qx(回溯而不是系统)。这是一个使用回溯的例子。但是,您可以对系统执行相同操作。
use English; ## So i can use $OS_ERROR rather than $!. see perlvar for more info
qx(exit 1); ## anything other than 0 is an error in Linux
print "failed\n" if $OS_ERROR; ## you can die here
然而,wget 可能并不总是失败。您可能会收到 404 页面,但不会被视为失败。
use Mojo::UserAgent; ## use Mojo
my $url = "http://madeup.com/hdhd";
my $res = Mojo::UserAgent->new->get($url)->result;
unless ($res->code==200) {
print "ERROR\n".$res->message."\n"; ## you can use die here
}
同上,使用 HTTP::Tiny
use HTTP::Tiny; ## use http tiny
my $url = "https://makeup.com/hdhd";
my $res = HTTP::Tiny->new->get($url);
unless ($res->{success}) {
print "ERROR\n".$res->{status}."\n"; ## you can die here
}
,
如果我想真正考虑孩子的话,我倾向于自己做fork
并更密切地管理这个过程。设置各种信号处理程序,以适当的值退出,等等。这使您可以对正在发生的事情进行细粒度的控制。那个分叉的进程甚至可能 exec
变成 wget
。而且,由于它是一个不同的过程,您可以直接向它发送信号。
但是,如果 wget 是您想要使用的命令,我想知道您为什么不使用模块来完成这项工作。当您有权访问请求和响应信息时,您将获得更多控制权。