“如果”条件不按预期工作

时间:2018-04-10 10:02:43

标签: linux perl if-statement

我看到Perl脚本存在两个问题:

  • 我的if条件==.!=等失败

  • ps -p $pid -o etime=引发错误sh: line 1: -o: command not found

我正在尝试检查进程是否已在运行,如果是的话

  • 如果它已运行超过40分钟,则终止该过程

  • 如果已运行30-40分钟,则发出通知

  • 如果运行时间少于30分钟,请退出

简单的if测试也失败了。我最后附上了示例代码。

有人可以告诉我这些问题的原因吗?

if ( `ps -ef | grep example | grep -v grep` ) {

    print "Process is already running\n";

    my $pid = `ps -ef | grep example | grep -v grep | awk '{print \$2}'`;

    if ( `ps -p $pid -o etime= | sed -e "s/:/\\n/g" | wc -l | grep 3` ) {

        print "1. Running for more than 40 mins\n";
        `ps -ef | grep example | grep -v grep | awk '{print \$2}' | xargs kill -9`;
    }
    elsif ( `ps -p $pid -o etime= | sed -e "s/:/\\n/g" | wc -l|grep "2"` ) {

        my $pmin = `ps -p $pid -o etime= | awk -F: '{print \$1}'`;

        if ( $pmin < 30 ) {

            print "Process running for 15 mins. Exiting";
            exit;
        }
        elsif ( $pid >= 40 ) {

            print "2.Running for more than 40 mins\n";
            `ps -ef | grep example | grep -v grep | awk '{print \$2}' | xargs kill -9`;
        }
        else {

            print "Process running for 30 mins. Notify";
        }
    }
}

my $psc = `ps -ef | grep example | grep -v grep >/dev/null 2>&1 && echo "Yes" || echo "No"`; 
print "PSC - $psc"; 

if ( $psc eq "Yes" ) { 
    print "running"; 
} 
else { 
    print "not running"; 
}

./ test.pl

PSC - Yes 
not running 

2 个答案:

答案 0 :(得分:4)

我认为这可能是你问题的根源:

elsif ($pid >= 40) {

因为那是进程ID。不是$pmin。因此,您基本上会杀死并处理ID&gt; 40,这几乎是任何过程,除了偶尔会随机获得低pid。

但从根本上说 - 炮轰psgrep是痛苦的。用:替换\n然后计算行是一件令人讨厌的事情 - 然后使用grep来匹配字符串也很脏。

为什么不使用Proc::ProcessTable之类的内容重写?

以下是您如何阅读流程表,查找特定流程ID(或集合)然后查询时间的示例:

#!/usr/bin/env perl

use strict;
use warnings;

use Proc::ProcessTable;
use Data::Dumper;

my $ps = Proc::ProcessTable->new;

my @target_processes = grep { $_->pid eq $$ } @{ $ps->table };

print Dumper \@target_processes;

sleep 10;

while (1) {

   foreach my $process ( grep { $_->cmndline =~ m/perl/ } @{ $ps->table } ) {
      sleep 5;
      print $process ->cmndline, " has been running for ",
        $process->time / 10000, "s\n";
      print Dumper \$process;
   }

}

注意 - time是一个高分辨率时间

答案 1 :(得分:0)

尝试以下更改

ps -A | grep firefox&gt; / dev / null 2&gt;&amp; 1&amp;&amp;回音“是”||回声“不”