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);
  };
};
4

2 に答える 2

3

あなたは近くにいます。あなたのコードは機能しません$return

while ( my $return ne "" ) {

最初の として別の変数 (while のスコープで宣言)$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} };
于 2013-07-02T21:18:32.443 に答える
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;
}
于 2013-07-02T21:19:49.603 に答える