다음 코드를 실행하면 마지막 서버가 인쇄되지 않습니다. 두 번째 마지막 배열 요소 다음에 스크립트가 멈 춥니 다.Perl 파이프 하위 프로세스에서 핸들 배열의 마지막 요소에 매달려 읽기
$ ./get_stuck.pl
92 18196
93 27420
94 17635
95 10258
96 10831
서버 '96'이후 '97'출력이 있어야 아직 존재하지 않고, 스크립트가 단지/그 시점에서 정지 응답 :
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";
출력은 다음과 같다. 내가 배열 대신 문자열을 사용하는 독자 섹션을 변경하는 경우
다음과 같이 여러 결과가있는 경우
foreach my $server (@servers) {
my $fh = $readers{$server};
my $procs = <$fh>;
printf "%s\n", $server;
}
가 ... 다음 스크립트는, 그러나, '97'를 포함하여 모든 서버를 인쇄 이 명령은 첫 번째 결과 만 출력합니다 (줄 바꿈을 어기는 것처럼 보입니다). 즉, 명령이 주어진 서버에 대해 3 개의 프로세스 ID를 리턴하면 첫 번째 프로세스 ID 만 인쇄됩니다.
왜 배열을 사용하면 스크립트가 마지막 요소에 멈추는 지에 대한 제안 사항이 있습니까? 또는 문자열을 사용하는 방법이 다소 바람직하지 않지만 모든 결과를 검색 할 수 있습니까?
필자는 'WRITER'도 닫지 않을 것이라고 생각했습니다. 나는 여전히 '<$fh>'에 쓰여진 스칼라가 그것을 어떻게 변화시키는지를 보지 못했다. 나는 그것을 어디 선가 놓치고 있는가? – zdim
@zdim 스칼라 컨텍스트에서는 첫 번째 줄만 가져옵니다 (또는 OP 명령에서 "* 그러나 명령에서 여러 결과가있는 경우 첫 번째 결과 만 출력됩니다 (줄 바꿈이 중단 된 것처럼 보입니다) *"). 반면에 목록 컨텍스트는 모든 행을 읽으므로 EOF에 도달 할 때까지 차단이 필요합니다. – melpomene
우수! 나는 WRITER를 닫으려고했으나 그 후에는'unless' 문 안에서했습니다. 제안한대로 어휘 변수를 사용하도록 코드를 업데이트했지만 명확성을 위해 명시 적 close 문을 포함했습니다. 도와 주셔서 대단히 감사합니다. 챔피언. – Stu