我有一个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 Original\n";
$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/
答案 0 :(得分:1)
最简单的解决方案是重启整个程序。
没有外部帮助(没有正确退出)
exec($^X, $0);
借助外部帮助(正确退出)
exit(254);
加
#!/bin/sh
while true ; do
program "$@"
e=$?
if [[ $e != 254 ]] ; then
exit $e
fi
done