使用Perl脚本在超时时跟踪和终止进程

时间:2015-07-01 08:09:48

标签: linux perl

我想编写一个可以监视正在运行的进程的Perl脚本。如果进程执行的时间超过预期时间,则应该将其终止。 我试图在Linux机器(Linux_x8664)上执行此操作。

我无法使用cronjob实现相同的功能,因为我想将其嵌入到另一个我长期使用的Perl脚本中。

如果您有任何建议,请建议我。

我有一个代码可以做到这一点,但问题是我的perl脚本正在使用系统命令运行一个进程。我想跟踪被调用进程的pid,我想在超时时终止它。

=========================

#!/usr/pde/bin/perl
 my $pid;
 my $finish=0;

 # actions after timeout to keep SIGHANDLER short
 #
 sub timeout {
   print "Timed out pid $pid\n";

   # kill the process group, but not the parent process
   local $SIG{INT}='IGNORE';
   local $SIG{TERM}='IGNORE';
   kill 'INT' = -$$;

   # eventually try also with TERM and KILL if necessary
   die 'alarm';
 }

 eval {
    local $SIG{ALRM} = sub { $finish=1 };

    alarm 5;

    die "Can't fork!" unless defined ($pid=fork); # check also this!

    if ($pid) { # parent
      warn "child pid: $pid\n";

      # Here's the code that checks for the timeout and do the work:
      while (1) {
        $finish and timeout() and last;
        sleep 1;
      }

      waitpid ($pid, 0);
    }
    else {      # child
      exec (q[perl -e 'while (1) {print 1}'  tee test.txt]);
      exit;     # the child shouldn't execute code hereafter
    }

    alarm 0;

 };

 warn "\$@=$@\n";`enter code here`
 die "Timeout Exit\n" if $@ and  $@ =~ /alarm/;
 print "Exited normally.\n";
 __END__

1 个答案:

答案 0 :(得分:0)

根据您的代码 - 强烈推荐use strictuse warnings的原因。

具体做法是:

Can't modify constant item in scalar assignment at line 17, near "$$;"

你没有做你认为你在那里做的事情。

如果将其设置为

 kill ( 'INT', -$$ ); 

然后,您将SIGINT发送到当前流程组 - 父子。我不知道为什么当你不想杀死父母时你为什么要这样做。

我建议你可以通过以下方式大大简化:

else {      # child
  alarm 5;
  exec (q[perl -e 'while (1) {print 1}'  tee test.txt]);
  exit;     # the child shouldn't execute code hereafter
}