我看到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";
}
PSC - Yes
not running
答案 0 :(得分:4)
我认为这可能是你问题的根源:
elsif ($pid >= 40) {
因为那是进程ID。不是$pmin
。因此,您基本上会杀死并处理ID&gt; 40,这几乎是任何过程,除了偶尔会随机获得低pid。
但从根本上说 - 炮轰ps
和grep
是痛苦的。用:
替换\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;回音“是”||回声“不”