我在检查$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);
};
};
答案 0 :(得分: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} };
答案 1 :(得分: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;
}