Что касается времени выполнения, вы используете alarm
Функциональность Perl для тайм-аута.
Ваш дескриптор ALRM может либо die
(см. Пример ниже), либо выполнить вызов DBI cancel
(sub { $sth->cancel };
)
Документация DBI на самом деле очень хорошо обсуждает это, а также примеры:
eval {
local $SIG{ALRM} = sub { die "TIMEOUT\n" }; # N.B. \n required
eval {
alarm($seconds);
... code to execute with timeout here (which may die) ...
};
# outer eval catches alarm that might fire JUST before this alarm(0)
alarm(0); # cancel alarm (if code ran fast)
die "$@" if $@;
};
if ( $@ eq "TIMEOUT\n" ) { ... }
elsif ($@) { ... } # some other error
Что касается слежения за памятью, вам просто нужен обработчик ALRM - вместо простого умирания / отмены - сначала проверяется потребление памяти вашим скриптом.
Я не буду вдаваться в подробности того, как измерить потребление памяти, поскольку это не связанный вопрос, на который, вероятно, уже был дан исчерпывающий ответ на SO, но вы можете использовать метод size()
из Proc::ProcessTable
, как описано в Perlmonks фрагмент Найти использование памяти программой Perl .