如果修改时间发生变化,则在运行时重新加载 perl 脚本



我有一个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

最新更新