perl如何定时每天执行任务

2025-05-13 18:36:00
推荐回答(1个)
回答1:

alarm

per脚本在自动化方面经常用到,其定时器功能不用很浪费,但也得好好地用。

在perl中定时的一般用法为:

eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
$nread = sysread SOCKET, $buffer, $size;
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
# timed out
}
else {
# didn't
}

经过timeou时间后,发送"alarm\n"的exception信息。eval块内的die中断当前用执行的程序,但是不会跳出整个程序,这也是为什么用eval的原因了。
后面还有一个对$@的unless判断,unless和if相反,如果$@不为"alarm\n",则throw exception.这条语句的条件正常条件下不会满足,也就是不会die.如果die被执行,程序会跳出,当前的exception信息会打印出来:
alarm
...propagated at xxx.pl line xxx.
当然这样的脚本我们不会让它这样执行,除非强行地想让程序跳出。

从上面的分析可知, $SIG{ALRM}中的handler,即sub函数体内代码,die与kill 'INT', -$$的作用类似。
-$$中的-其实没有什么意义,只是发一个'INT'中信号,对system执行的命令起作用。如果强行指定$$,中断信号不一定对eval内system执行语句起作用,仅仅是当前perl的进程发送中断信号。Perl中定时器alarm的die与kill

如果遇到这样的需求,要自动地运行一些相对独立的程序,而这些程序可能有些要挂掉,导致后面的程序无法运行,要想看到一个完整运行的结果,这时候alarm就会用上场。

per脚本在自动化方面经常用到,其定时器功能不用很浪费,但也得好好地用。

在perl中定时的一般用法为:

eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
$nread = sysread SOCKET, $buffer, $size;
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
# timed out
}
else {
# didn't
}

经过timeou时间后,发送"alarm\n"的exception信息。eval块内的die中断当前用执行的程序,但是不会跳出整个程序,这也是为什么用eval的原因了。
后面还有一个对$@的unless判断,unless和if相反,如果$@不为"alarm\n",则throw exception.这条语句的条件正常条件下不会满足,也就是不会die.如果die被执行,程序会跳出,当前的exception信息会打印出来:
alarm
...propagated at xxx.pl line xxx.
当然这样的脚本我们不会让它这样执行,除非强行地想让程序跳出。

从上面的分析可知, $SIG{ALRM}中的handler,即sub函数体内代码,die与kill 'INT', -$$的作用类似。
-$$中的-其实没有什么意义,只是发一个'INT'中信号,对system执行的命令起作用。如果强行指定$$,中断信号不一定对eval内system执行语句起作用,仅仅是当前perl的进程发送中断信号。}