我想编写一个可以监视正在运行的进程的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__
答案 0 :(得分:0)
根据您的代码 - 强烈推荐use strict
和use 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
}