25

これを行うにはいくつかの方法がありますが、どれが最適かはわかりません。

これが私が考えることができるものです:

  • pgrep を使用してプロセスを探します。
  • flock を使用してスクリプト自体をロックし、実行するたびにロックされているかどうかを確認します。
  • /var/run/program_name.pid に pid ファイルを作成して存在を確認し、必要に応じて pid を比較します。

これを行うには、おそらくもっと多くの方法があります。最善のアプローチは何だと思いますか?

4

3 に答える 3

42

それを行うには多くの方法があります。PID ファイルは、それを行う従来の方法です。プログラム自体など、ファイルをロックすることもできます。この小さなコードでうまくいきます。

use Fcntl ':flock';
open my $self, '<', $0 or die "Couldn't open self: $!";
flock $self, LOCK_EX | LOCK_NB or die "This script is already running";

PID ファイルに対する利点の 1 つは、プログラムの終了時にファイルが自動的にロック解除されることです。信頼できる方法で実装する方がはるかに簡単です。

于 2009-01-18T21:49:16.357 に答える
10

古い PID ファイルのトリックを実行します。

  • 開始プロセス
  • 「myprog.PID」というファイルがあるかどうかを確認します
  • 実行中の proc の存在を確認します。kill 0、$pid を使用して一致する PID を持つ
  • if prog PID proc の名前。一致し、大声で不平を言って終了します
  • そうでない場合は、古い「myprog.PID」をクリーンアップします
  • 「myprog.PID」というファイルを作成して続行します

HTH

乾杯、

ロブ

于 2009-01-18T21:26:23.347 に答える
2

リストするオプションはすべて問題ありません。ただし、これに伴う 1 つのことは、ごくまれに、非常に長い時間実行されるプロセス (つまり、何かを待機してスタックする) になる可能性があることに注意することです。他の実行中のインスタンスが実行されている時間を監視し、特定の時間 (1 日など) を超えた場合に自分自身にアラートを送信することを検討することをお勧めします。

于 2009-01-18T22:02:35.987 に答える