SSH를 통해 원격으로 실행하는 경우 다음의 간단한 Perl 스크립트의 동작을 이해할 수 없습니다. 나는 펄 5.10.0 내 리눅스 박스에 일반적으로 그것을 실행하면Linux에서 SSH를 통해 실행되는 멀티 스레드 Perl 스크립트의 문제점
use strict;
use warnings;
use threads;
use threads::shared;
use POSIX;
my $print_mutex : shared;
################################################################################
sub _print($)
{
my $str = shift;
lock($print_mutex);
my $id = threads->tid();
my $time = strftime('%H:%M:%S', localtime time);
print "$time [$id] $str";
return;
}
################################################################################
sub run()
{
for my $i (1 .. 3)
{
_print("Begin $i\n");
sleep 1;
_print("End $i\n");
}
return threads->tid();
}
################################################################################
_print "Starting test.\n";
my @threads;
for my $thr_num (1 .. 2)
{
my $thr = threads->create('run');
push @threads, $thr;
_print "Thread created.\n";
}
foreach (@threads)
{
my $id = $_->join;
_print "Thread '$id' finished.\n";
}
_print "Test finished.\n";
################################################################################
내가 예상 결과를 얻을 : 나는 같은 로컬 호스트에 (SSH를 통해 실행 그러나
$ perl /tmp/a.pl 14:25:54 [0] Starting test. 14:25:54 [0] Thread created. 14:25:54 [1] Begin 1 14:25:54 [0] Thread created. 14:25:54 [2] Begin 1 14:25:55 [1] End 1 14:25:55 [1] Begin 2 14:25:55 [2] End 1 14:25:55 [2] Begin 2 14:25:56 [1] End 2 14:25:56 [1] Begin 3 14:25:56 [2] End 2 14:25:56 [2] Begin 3 14:25:57 [1] End 3 14:25:57 [0] Thread '1' finished. 14:25:57 [2] End 3 14:25:57 [0] Thread '2' finished. 14:25:57 [0] Test finished. $
을, 그러나 그것을
$ ssh localhost 'perl /tmp/a.pl' 14:26:11 [0] Starting test. 14:26:11 [0] Thread created. 14:26:11 [1] Begin 1 14:26:12 [1] End 1 14:26:12 [1] Begin 2 14:26:13 [1] End 2 14:26:13 [1] Begin 3 14:26:14 [1] End 3 14:26:11 [2] Begin 1 14:26:12 [2] End 1 14:26:12 [2] Begin 2 14:26:13 [2] End 2 14:26:13 [2] Begin 3 14:26:14 [2] End 3 14:26:11 [0] Thread created. 14:26:14 [0] Thread '1' finished. 14:26:14 [0] Thread '2' finished. 14:26:14 [0] Test finished. $
을 내가 단일 스레드 Perl 스크립트에서 이것을 본 적이과 내가 함께 문제를보기 시작하는 것이 내가 /주의 : 나는 아주 이상한 결과가() ID를 타임 스탬프 자세히 보면 및 스레드 수) 중요하지 않습니다 O 첫 번째 스레드가 생성 된 직후.
Windows에서 최신 Perl-5.12의 문제를 재현 할 수 있었으므로 문제가 Perl/OS에만 해당한다고 생각하지 않습니다.
누군가 여기서 잘못된 점을 설명해 주시겠습니까?
음 ...이 경우에는 라인 버퍼 모드가 활성화되어있는 것처럼 보입니다. "\ n"을 모두 제거하면 "ssh -t"로 실행해도 동일한 동작을 볼 수 있습니다. –
초기 생각은 버퍼링 문제였습니다. \ n을 추가하는 것이 좋습니다. 그러나 다시 보았는데 이미있었습니다. 나는 IO 버퍼링을 끄는 시도를 할 수 있다고 생각하지만 기본적으로 이유가있다 ... –
버퍼링 모드와 관련이 없다고 생각한다. 사용중인 버퍼링 모드에 관계없이 출력의 시간은 단조롭게 증가해야합니다 (그러나 그렇지 않습니다). 버퍼링 모드는 시스템 호출 쓰기 호출 시간 및 횟수에만 영향을 미칠 수 있습니다. 내가 맞습니까? –