如果修改时间更改,则在运行时重新加载perl脚本

时间:2017-05-19 23:01:45

标签: 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 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/

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是重启整个程序。

没有外部帮助(没有正确退出)

exec($^X, $0);

借助外部帮助(正确退出)

exit(254);

#!/bin/sh
while true ; do
   program "$@"
   e=$?
   if [[ $e != 254 ]] ; then
      exit $e
   fi
done