加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl多进程数量控制-信号或者判断pid是否存在

发布时间:2020-12-15 21:00:18 所属栏目:大数据 来源:网络整理
导读:实例的功能就是多进程ping不同的主机,查看主机是否可连通。。试了一把。 1.通过子进程返回的CHLD信号 #!/usr/bin/perl -w use Net::Ping; use POSIX; my @ip; open IN,'ip.txt' or die'error'; ?@ip=IN; close(IN); my $total=$#ip+1; my $num=$total; my $

实例的功能就是多进程ping不同的主机,查看主机是否可连通。。试了一把。

1.通过子进程返回的CHLD信号

#!/usr/bin/perl -w
use Net::Ping;
use POSIX;
my @ip;
open IN,'ip.txt' or die'error';
?@ip=<IN>;
close(IN);
my $total=$#ip+1;
my $num=$total;
my $a=0;
my $bam=0;
$SIG{CHLD}=sub{$a--;$bam++};
my %pid;
while($total)
{
?if($a<5)
? {
?? my $pid=fork();
?? $pid{$pid}=1;
?? if($pid == 0)
??? {
????? my $p=Net::Ping->new();
????? my $de=$num-$total;
????? $ip[$de]=~s/n//g;
????? if($p->ping($ip[$de],5))
?????? {
????????? print "$ip[$de] is reachablen";
??????? }
????? else{
????????? print "$ip[$de] is noreachn";
?????? }
????? $p->close();
????? exit 0;
??? }
?? $a++;
?? $total--;
?? }
? while($bam >0)
?? {
???? while(my $exit_pid=waitpid(-1,WNOHANG) > 0)
????? {
??????? $bam--;
??????? if(exists($pid{$exit_pid})){delete $pid{$exit_pid};}
????? }
?? }
}

my @left=keys %pid;
if(@left)
?{
?? foreach my $j(@left)
??? {
??????? waitpid($j,0);
??? }
?}
?

2. 通过判断子进程的pid是否存在

? #!/usr/bin/perl -w use Net::Ping; use POSIX; $SIG{CHLD}='IGNORE'; my @ip; open IN,'ip.txt' or die'error'; ?@ip=<IN>; close(IN); my $total=$#ip+1; my $i; my %pid; for($i=0;$i<$total;$i++) ?{ ??? my @pids=keys %pid; ??? while($#pids >=4) ???? { ????????? foreach my $j(@pids) ?????????? { ????????????? delete $pid{$j} unless(kill 0 =>$j); ?????????? } ???????? @pids=keys %pid; ???? } ?? my $pid=fork(); ?? if($pid) ???? { ????????? $pid{$pid}=1; ???? } ? else{ ?????? my $p=Net::Ping->new(); ?????? $ip[$i]=~s/n//g; ????? if($p->ping($ip[$i],5)) ?????? { ????????? print "$ip[$i] is reachablen"; ?????? } ????? else{ ????????? print "$ip[$i] is noreachn"; ?????? } ????? $p->close(); ????? exit 0; ????? } ?} my @left=keys %pid; while($#left != -1) ?{ ?? foreach my $k(@left) ?? { ????? delete $pid{$k} unless(kill 0 =>$k); ?? } ? @left=keys %pid; } ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读