2013-07-02 2 views
3

$return 변수를 검사하는 데 매우 어려움을 겪고 있습니다. print "return = ". $return ."\n";은 프로세스가 여전히 실행 중이더라도 항상 비어있게됩니다. 초기화되지 않은 변수에 대한 경고가 표시됩니다. 누군가 설명해 주시겠습니까?변수를 검사 할 수 없습니다.

my $process="MInstaller"; 
my $return=` ps -eaf |grep $process | grep -v grep`; 
sub chk_proc{ 
    print "in chk_proc\n"; 
    print "\n"; 
    print "return = ". $return ."\n"; 
    while (my $return ne "") { 
    sleep(5); 
    }; 
}; 
+3

당신이 게시 한 바깥에서'chk_proc()'루틴을 호출하고 있습니까? – PaulProgrammer

+3

while 루프는 새로운 변수 인'my $ return ...'을 사용하고'ps' 백틱 출력을 참조하지 않습니다. 또한 sleep 루프를 수행하는 곳에서 chk_proc을 호출하면, 그 범위 내에서'$ return' 변수를 업데이트 할 방법이 없으므로 루프가 무한 루프됩니다. – PaulProgrammer

+2

경고는'my $ return ne ""를 사용하는 것입니다.'$ return'은 앞의'my'에 의해 실제로''''와 비교되는 새로운 변수입니다. undef 이외의 값. 그것을 피하려면'my'를 제거하십시오. –

답변

3

끝났습니다.

while (my $return ne "") { 

에서 변수 $return 첫 번째 $return로 (동안의 범위에 선언 된) 다른 변수이기 때문에 코드는,하지 작업을 수행합니다.

당신은 다음을 시도 할 수 있습니다 :

use 5.014; 
use warnings; 

chk_proc('[M]Installer'); #use the [] trick to avoid the 'grep -v grep :) 

sub chk_proc{ while(qx(ps -eaf |grep $_[0])) {sleep 5} }; 
+0

위의 코드를 사용했지만 grep에서 오류가 발생합니다. 사용법 : grep [옵션] ... 패턴 [파일] ... 자세한 내용은'grep --help '를 시도하십시오. – user1718586

+0

@ user1718586 두 개의 다른 시스템에서 스크립트를 확인하고 작동합니다. 위와 똑같이 사용하는 것이 확실합니까? grep이 패턴을 얻지 못하는 것 같기 때문에 chk_proc 호출에 검사 된 프로그램 이름이 포함되어 있지 않습니다. 예 : '[M] Installer' – jm666

+0

그래서 복사하고 붙여 넣기 만하면됩니다. 스크립트 이름을 변경했지만 여전히 grep 오류가 발생합니다. 아래를보십시오 : chk_proc ('[M] apUserInstall'); #chk_proc ('[M] apUserInstall'); grep -v grep을 피하려면 [] 트릭을 사용하십시오. sub chk_proc {while (qx (ps -eaf | grep $ _ [0])) {sleep 5}}; – user1718586

0
  • 당신은 use warnings;use strict;를 사용하고 있습니까?
  • ps 대신 pgrep을 사용하면 어떨까요?
  • $return이 두 줄 이상을 반환하면 어떻게됩니까?

서브 루틴이 프로세스가 실행 중이고 다른 루프에서 사용했는지 여부 만 확인하면 프로그램이 원활하게 진행됩니다.

여기 내 확인 프로세스 서브 루틴은 찾은 모든 프로세스의 목록을 반환합니다. 루프 내에서이 프로세스를 사용하여 프로세스 자체가 중지되었는지 확인할 수 있습니다. 프로세스 목록을 얻으려면 qx()을 사용한 다음 split을 사용하여 프로세스 목록을 만들 수 있습니다.

use warnings; 
use strict; 
use feature qw(say); 

use constant { 
    PROCESS => "MInstaller", 
    SLEEP => 5, 
}; 

while (process_check(PROCESS)) { 
    say qq(Process) . PROCESS . qq(is running...); 
    sleep SLEEP;; 
} 
say qq(Process) . PROCESS . qq(has ended.); 

sub process_check { 
    my $process = shift; 
    open (my $process_fh, "-|", "pgrep $process"); 
    my @process_list; 
    while (my $line = <$process_fh>) { 
     chomp $line; 
     push @process_list, $line; 
    } 
    close $process_fh; 
    return @process_list; 
} 
관련 문제