我有一个perl脚本在任何给定时间运行,如果满足特定条件,就会触发另一个perl脚本,否则它会休眠1分钟。每次我必须对主脚本进行修改并重新运行它时,我都必须确保没有子脚本正在运行,然后终止它并重新运行。
所以,我一直在寻找我是否可以根据修改时间自动重新加载perl脚本。我遇到了下面的链接(下面共享的代码片段(并且它可以工作。但是想知道,这是否是正确的方法?有什么指示吗?
代码片段在这里:(test.pl 继续运行,Worker.pm 可以根据需要进行修改(
Worker.pm:
package Worker;
our $iteration = 1;
sub do_some_work {
return if $iteration > 100;
printf "$iteration Originaln";
$iteration++;
sleep 1;
return 1;
}
sub save_state {
return $iteration;
}
sub load_state {
my $class = shift;
$iteration = shift;
}
1;
test.pl
#!/usr/bin/env perl
use lib '.';
use Worker;
my $library_file = $INC{'Worker.pm'};
my $library_mtime = ( stat( $library_file ) )[9];
while ( Worker->do_some_work() ) {
my $new_mtime = ( stat( $library_file ) )[9];
next if $new_mtime == $library_mtime;
$library_mtime = $new_mtime;
eval {
my $state = Worker->save_state();
delete $INC{'Worker.pm'};
require 'Worker.pm';
Worker->load_state( $state );
};
}
来源:https://www.depesz.com/2015/01/21/reloading-of-perl-script-while-its-running/
最简单的解决方案是重新启动整个程序。
没有外部帮助(无法正确退出(
exec($^X, $0);
在外部帮助下(正确退出(
exit(254);
加
#!/bin/sh
while true ; do
program "$@"
e=$?
if [[ $e != 254 ]] ; then
exit $e
fi
done