【发布时间】:2017-10-02 02:56:57
【问题描述】:
运行以下代码时,不会打印最后一个服务器 - 脚本在倒数第二个数组元素之后“挂起”。
my %readers;
my $command = "pgrep -f weblogic.Name";
foreach my $server(@servers) {
pipe($readers{$server},WRITER);
unless(my $pid = fork()) {
my $response = qx(ssh -q oracle\@$server "$command");
print WRITER $response;
exit();
}
}
foreach my $server (@servers) {
my $fh = $readers{$server};
my @procs = <$fh>;
chomp(@procs);
for my $proc (@procs) {
printf "%s\t%s\n", substr($server,8), $proc;
}
}
print "end\n";
输出如下:
$ ./get_stuck.pl
92 18196
93 27420
94 17635
95 10258
96 10831
在 '96' 之后应该有一个服务器 '97' 输出,但没有,并且脚本只是挂起/停止在那个点。
如果我将阅读器部分更改为使用字符串而不是数组,如下所示:
foreach my $server (@servers) {
my $fh = $readers{$server};
my $procs = <$fh>;
printf "%s\n", $server;
}
...然后脚本会打印包括“97”在内的所有服务器,但是,如果该命令有多个结果,则只会打印第一个结果(似乎在换行符处中断)。换句话说,如果命令返回给定服务器的 3 个进程 ID,则只打印第一个进程 ID。
关于为什么使用数组会导致脚本挂在最后一个元素上的任何建议?或者也许(不太理想)我如何使用字符串,但检索所有结果?
【问题讨论】: