2013-07-02 89 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'倒退輸出。另外,如果你在調用chk_proc,那麼你將在哪裏進行睡眠循環,它會無限循環,因爲你沒有辦法讓'$ return'變量在該範圍內更新。 – PaulProgrammer

+2

你得到的警告是用你的'我的$ 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上收到一個錯誤:Usage:grep [OPTION] ... PATTERN [FILE] ... 嘗試'grep --help'以獲取更多信息。 – user1718586

+0

@ user1718586只是在兩個不同的系統中檢查腳本並運行。你確定使用完全如上?由於錯誤看起來像你的grep沒有得到這樣的模式,所以你的chk_proc調用不包含檢查的程序名。例如'[M]安裝程序' – 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;
  • 怎麼樣使用pgrep而不是ps
  • 如果$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; 
}