我的 Perl 脚本如何检测子进程使用“system”运行何时被杀死?

问题描述

我的 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 是您想要使用的命令,我想知道您为什么不使用模块来完成这项工作。当您有权访问请求和响应信息时,您将获得更多控制权。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...