Perl で File::Lockfile を使用して、スクリプトの単一インスタンスを確保する
私はPerlでいくつかの監視スクリプトを書き、crontabに置いて実行するようにしています。スクリプトの実行に時間がかかりすぎて、複数のインスタンスを同時に実行してしまうことがあるので、1つのインスタンスだけを実行するようにスクリプトに制御を加えることが必要です。
最もシンプルで自然なアイデアは、スクリプト内で空のロックファイルをチェックして作成し、スクリプトが終了したらそれを削除することです。これは、ファイルが存在するかどうかを判断することで、スクリプトが実行されたかどうかを判断する方法です。ただし、これにはバグがあり、実行中にスクリプトが異常終了し、ロックファイルが適切に削除されなかった場合、スクリプトは再び実行されなくなる。
空のロック・ファイルでうまくいかない場合は、ロック・ファイルにプロセスのPID番号などの内容を少し追加し、そのPID番号のプロセスがまだ実行されているかどうかをチェックすることで、上記のバグを回避することを検討してみてください。CPAN には File::Lockfile, File::Pid, Proc::PID::File など、これを実現する既成のモジュールがたくさんあります。
非常にシンプルなFile::Lockfileの例です。
以下はそのコード・スニペットです。
#! /usr/bin/perl -w
useFile::Lockfile;
# lockfile is located in the /tmp directory and is called test_file_lock.lck
my $lockfile= File::Lockfile->new('test_file_lock','/tmp');
# Check if the script is already running, and exit if it is
if ( my $pid= $lockfile->check ) {
print"program is already running with PID: $pid";
exit;
}
#Update the lock file
$lockfile->write;
# Script logic
sleep30
#deletelockfile
$lockfile->remove;
File/Lockfile.pm のソースコードを見てみると、ロックファイルに記録されているプロセスが既に実行されているかどうかの判断は kill -0 $pid で簡単にできることがわかると思います。つまり、上記のモジュールが無くても、自分で実装するのはとても簡単なのです。
概要を説明します。
この方法は、単一インスタンスを制限するスクリプトでよく使用され、MySQL などのプログラムも、各起動前に最後のレガシー mysql.pid ファイルをチェックします。
もう一つの方法。ロックファイルに排他ロックをかけ、一意性を確保するためにロックがあるかどうかを判断する。
関連
-
Windows 10でのPerl環境のインストールと設定のための詳細チュートリアル
-
Perlのサブルーチン 学習メモ
-
Perlのコマンドラインプログラミングでよく使われるパラメータを1文にまとめたもの
-
Perl で QR コード用のプレーン HTML コードを生成する例
-
PerlによるMSSQLへのアクセスとMySQLデータベースへの移行スクリプト例
-
perlにおけるmyとourの違いの解析
-
perl は目的のファイルのパスを読み込み、対応するファイルを開きます。
-
長さを指定し、ランダムなDNA配列を生成するperlスクリプトコード
-
[解決済み] Perlからsedを使うには?
-
[解決済み] Perlスクリプトにコンパイルエラーがないことを確認する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
指定したフォルダーにあるリンク切れファイルのシンボリックリンクを自動的に削除するスクリプト
-
Perl学習ノート - CPANの使い方入門
-
perlの文字列操作関数chompとchopの紹介
-
Tesseract-OCRを使用したPerl Captcha認識チュートリアル
-
Perl の Getopt::Long モジュールを使用して、ユーザーのコマンドライン引数を受け取ります。
-
perl で書かれた乱数話法プログラム (rand random function)
-
windows perlでフラッシュ後にスクリプトが終了しないようにする方法
-
重複するコンテンツ(重複する行+重複するフィールドの配列)を削除するための perl スクリプトコード
-
perl変数$/の使用方法について説明します。コンテキストが行モードのとき、$/は行を区別するものを定義します。
-
perlでサブルーチンの引数を参照(渡す)する2つの方法