みんなPHPアプリ(バッチ)の多重起動防止どうしてる? 過去に数々の地雷を踏んだので、もう自分で書きたくないのだけど、良いライブラリとかあるのかしら。 (当時は「起動したら自分のプロセスIDをファイルに書く」「ファイルがあればそのプロセスIDが生きてるか ps とか実行して確認」してた)
2020-02-27 11:15:10@tomzoh 大昔に bto さんが作った singleExecution を使ってたことがあったけど、今見たらリンク先が消えてるなぁ。 blog.bz2.jp/archives/2008/… あ、自分でパッチ当てたのを gist に置いてたんだったw gist.github.com/koyhoge/1446922
2020-02-27 11:30:38@tomzoh ちなみにパッチ作った要因となった ProcessForker はこちら。PSR 前のコードだ…w koyhogetech.hatenablog.com/entry/20111208…
2020-02-27 11:36:32@koyhoge 子プロセス〜〜。先のコードにもそれっぽいコード片ありましたね。PHPで大量PUSH通知を作った思い出が蘇ってきました。(つらかった)(速くもなかった)(Gaurunに置きかえた)
2020-02-27 11:39:39@tomzoh テヘッ) それはそれとして、systemd活用を避けるならロックファイル(PID含む)制御で、途中で異常終了で落ちる念の為にshutdown functionに登録したハンドラで消す(アラートもお好みで)のが楽かな 途中で死んじゃうのが許される処理なら、max execution設定して絶対に死んでもらうのも
2020-02-27 12:07:23@tomzoh ジョブキューまでくんで(タスク二重取りさせないのはジョブキューに任せる)、そもそも多重起動が許すというがんばりもありますね。 「タスク差し込む処理」が突き抜けるほど時間かかることはないはずなので。
2020-02-27 12:08:52@uzulla 昔、謎の突然死からの2度と起動しない、を体験してて、OOM Killerに殺された場合どうなるんだろう?が気になってます。(プロセスID見れば大丈夫なんだけど)
2020-02-27 12:09:45@tomzoh そういうのもあって、個人的にはPIDおすすめしてないですね。残存ロックファイルは「1日とかはありえんやろ(慢心)」で別で消す。
2020-02-27 12:10:56@tomzoh 「PID含む」は、PIDを含めたロックファイルという意味ではなくて、たんなるロックファイル(実行開始時刻をいれておく)というのが個人的には多いです。
2020-02-27 12:11:50@tomzoh 信用できるジョブキューならそれが正義とおもいますよ、同時実行されても大丈夫にすれば(やろうと思えば)多重化で速度もあがってバンザイ
2020-02-27 12:13:47@tomzoh cronとかで定時実行したい、という前提で、かつ最近のOSでやるならsystemd timerに全部丸投げするのが一番楽だと思いますね
2020-02-27 11:43:39@nasa9084 systems timerって重複起動まで面倒みてくれるんですか?(チョイ調べしたけどわからなかった)(その過程で flock を見つけてそれでいいのではとなった)(flock って OOM killer に殺されても解除されるのかな)
2020-02-27 11:48:14@tomzoh たぶん調べても「重複起動しない!」という情報は出てこないとは思うんですけど、それはそもそもsystemd timerの仕組み上「重複起動が基本的にできない」形になってるので、明記されることがない、という感じです
2020-02-27 11:51:58@tomzoh プロセスの多重起動をアドバイザリロックで防止する for PHP - Qiita qiita.com/ngyuki/items/5… これとかですかね
2020-02-27 16:41:56