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 回答