2017-05-19 9 views
2

私はperlスクリプトを任意の時点で実行しており、特定の条件が満たされていれば別のperlスクリプトを起動します。 メインスクリプトを変更して再実行するたびに、サブスクリプトが実行されていないことを確認してから、それを強制終了して再実行する必要があります。修正時間が変更された場合に実行中にperlスクリプトを再ロード

私は、変更時間に基づいて自動的に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/

+2

を参照してください[再](HTTPS:/ /metacpan.org/pod/again)。 –

+1

リンクを直接参照して謝罪し、ここにコンテンツを貼り付けてください。 – iDev

+0

あなたが探しているものは[this post](http://stackoverflow.com/a/37096022/4653379)ですか? (私は問題の説明を完全に理解していません。) – zdim

答えて

1

最も簡単な解決策はプログラム全体を再起動します。 (正常に終了)外部の助けを借りて、外部の助けなし

(ない正しく終了しません)

exec($^X, $0); 

exit(254); 

プラス

#!/bin/sh 
while true ; do 
    program "[email protected]" 
    e=$? 
    if [[ $e != 254 ]] ; then 
     exit $e 
    fi 
done 
関連する問題