0

論理チェックを行い、特定の条件が満たされているかどうかを確認する perl スクリプトを実行しています。例: 一定の時間が経過した場合、そのデータを更新する別のスクリプトを実行する Linux サーバーで system() コマンドを実行したいと考えています。ファイルを更新するスクリプトは、現在通過しなければならないファイルの量で 10 ~ 15 秒かかりますが、月のピーク時には最大 30 秒かかる場合があります。

perl スクリプトを実行したいのですが、system() コマンドを実行する必要がある場合、残りのスクリプトを完了する前に system() が完了するのを待たないようにします。これについて最善の方法は何ですか?

ありがとうございました

4

4 に答える 4

5

システムはシェルでコマンドを実行するため、ジョブ制御を含むすべてのシェル機能を使用できます。したがって、次のようにコマンドの最後に & を貼り付けてください。

system "sleep 30 &";
于 2012-12-21T16:42:00.123 に答える
2

を使用forkして子プロセスを作成し、子プロセスexecで system の代わりに使用して他のスクリプトを呼び出します。 exec別のプロセスで他のスクリプトを実行し、すぐに戻ります。これにより、子が終了できます。一方、親スクリプトは、必要なことを完了して終了することもできます。

これをチェックしてください。それはあなたを助けるかもしれません。

このページには、フォークの使用方法の別の良い例があります。

于 2012-12-21T16:46:54.847 に答える
1

Perl からの外部プログラムの実行 (バックグラウンド プロセスの実行を含む) に関する優れたチュートリアルがhttp://aaroncrane.co.uk/talks/pipes_and_processes/paper.htmlにあります。

于 2012-12-21T23:58:58.267 に答える
1

出版日のために駄洒落を意図したものではありませんが、ゾンビに注意してください! 詳細はperlipcを参照してください。ただし、私があなたの問題を理解している限り、アップデーターと呼び出し元プロセスの間の関係を維持する必要はありません。この場合、単に「起動して忘れる」方が簡単です。

use strict;
use warnings qw(all);
use POSIX;

# fork child
unless (fork) {
    # create a new session
    POSIX::setsid();

    # fork grandchild
    unless (fork) {

        # close standard descriptors
        open STDIN, '<', '/dev/null';
        open STDOUT, '>', '/dev/null';
        open STDERR, '>', '/dev/null';

        # run another process
        exec qw(sleep 10);
    }

    # terminate child
    exit;
}

この例でsleep 10は、プロセスのグループに属していないため、親プロセスを強制終了しても子プロセスには影響しません。

于 2012-12-21T17:40:20.863 に答える