• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perlの多重起動を禁止したい)

Perlの多重起動を禁止したい

このQ&Aのポイント
  • main_01.plというプログラムがすでに起動していた場合、main_01.plはすぐに終了するように組みたい
  • テキストファイルにロックをかけ、ロック中であるならばプログラムは処理を行わずすぐに終了することで多重起動を禁止したい
  • タイムアウト処理と排他処理を使用して、main_01.plの多重起動を制限する方法を考えています

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

> # 排他処理開始 > open(LOCK,"$lockfile"); > flock(LOCK,2); このやりかただと、たぶん質問者さんの意図通りにはなりません。 プログラムの動作に10分以上かかって次のプログラムが起動した場合、 後から起動したプログラムは ・flock の呼び出しで、先に起動したプログラムが終了する(ロックが解除される)まで待つ ・その後で、処理を実行する ということになります。 重複実行はしませんが、起動した回数だけ必ず処理を実行しますので、 処理に毎回10分以上かかるような状況になった場合、どんどん未処理(終了待ち)のプロセスが増えていくことになります。 flock の処理は、 flock(LOCK,6) or die("実行中です"); とした方がいいでしょう。 flock は、第2引数が2(LOCK_EX)の場合は、あとから実行した方はロックが解除されるまで動作が停止しますが、 第2引数が6(LOCK_EX|LOCK_NB)の場合は、あとから実行した方がロック中だった場合は、0(エラー)を返します。 そのため、こうすることで、 「そのファイルがロック中であるならばプログラムは処理を行わずすぐに終了する」 という処理になります。

nakisan2011_12
質問者

お礼

ありがとうございます、とてもうまく行きました。flock第2引数、勉強になりました! 実際に試してみたところ、うまく多重起動を禁止することができました。

その他の回答 (1)

回答No.1

open(LOCK,"$lockfile"); ↓ open(LOCK,"$lockfile") or die("多重実行禁止\n"); 「オープンに失敗する理由は、もう誰かがオープンしているからだ」と言うのが前提。 「もう誰かがオープンしている」ってのは「もう誰かが起動してる」ってのと一緒。

nakisan2011_12
質問者

お礼

返信ありがとうございます、参考にさせて頂きます!