バッチの重複実行防止をどうするか

3
Tomoki Hasegawa @tomzoh

みんなPHPアプリ(バッチ)の多重起動防止どうしてる? 過去に数々の地雷を踏んだので、もう自分で書きたくないのだけど、良いライブラリとかあるのかしら。 (当時は「起動したら自分のプロセスIDをファイルに書く」「ファイルがあればそのプロセスIDが生きてるか ps とか実行して確認」してた)

2020-02-27 11:15:10
KOYAMA Tetsuji (こいほげ) @koyhoge

@tomzoh 大昔に bto さんが作った singleExecution を使ってたことがあったけど、今見たらリンク先が消えてるなぁ。 blog.bz2.jp/archives/2008/… あ、自分でパッチ当てたのを gist に置いてたんだったw gist.github.com/koyhoge/1446922

2020-02-27 11:30:38
Tomoki Hasegawa @tomzoh

@koyhoge おー、あざます! PIDベースですね。やっぱそれですかね〜。

2020-02-27 11:32:48
KOYAMA Tetsuji (こいほげ) @koyhoge

@tomzoh ちなみにパッチ作った要因となった ProcessForker はこちら。PSR 前のコードだ…w koyhogetech.hatenablog.com/entry/20111208…

2020-02-27 11:36:32
Tomoki Hasegawa @tomzoh

@koyhoge 子プロセス〜〜。先のコードにもそれっぽいコード片ありましたね。PHPで大量PUSH通知を作った思い出が蘇ってきました。(つらかった)(速くもなかった)(Gaurunに置きかえた)

2020-02-27 11:39:39
uzulla @uzulla

@tomzoh swooleとかで書けば(都度起動しない常駐)デーモンプロセスになるので解決()

2020-02-27 11:59:41
uzulla @uzulla

@tomzoh テヘッ) それはそれとして、systemd活用を避けるならロックファイル(PID含む)制御で、途中で異常終了で落ちる念の為にshutdown functionに登録したハンドラで消す(アラートもお好みで)のが楽かな 途中で死んじゃうのが許される処理なら、max execution設定して絶対に死んでもらうのも

2020-02-27 12:07:23
uzulla @uzulla

@tomzoh ジョブキューまでくんで(タスク二重取りさせないのはジョブキューに任せる)、そもそも多重起動が許すというがんばりもありますね。 「タスク差し込む処理」が突き抜けるほど時間かかることはないはずなので。

2020-02-27 12:08:52
Tomoki Hasegawa @tomzoh

@uzulla 昔、謎の突然死からの2度と起動しない、を体験してて、OOM Killerに殺された場合どうなるんだろう?が気になってます。(プロセスID見れば大丈夫なんだけど)

2020-02-27 12:09:45
uzulla @uzulla

@tomzoh そういうのもあって、個人的にはPIDおすすめしてないですね。残存ロックファイルは「1日とかはありえんやろ(慢心)」で別で消す。

2020-02-27 12:10:56
uzulla @uzulla

@tomzoh 「PID含む」は、PIDを含めたロックファイルという意味ではなくて、たんなるロックファイル(実行開始時刻をいれておく)というのが個人的には多いです。

2020-02-27 12:11:50
Tomoki Hasegawa @tomzoh

@uzulla そすね〜。Drupalはジョブキュー持ってるので活かせれば解決なのかな、とも思ってます。

2020-02-27 12:12:38
uzulla @uzulla

@tomzoh 信用できるジョブキューならそれが正義とおもいますよ、同時実行されても大丈夫にすれば(やろうと思えば)多重化で速度もあがってバンザイ

2020-02-27 12:13:47
Tomoki Hasegawa @tomzoh

@uzulla あるねー。「消すタイミングのチューニング」をしたくないのでプロセスID見たりしてました。

2020-02-27 12:14:28
Tomoki Hasegawa @tomzoh

@lestrrat ありがとうございます!知らなかった!よさそう!

2020-02-27 13:33:20
Daisuke Maki @lestrrat

@tomzoh ふるーーーーーーい、おじいちゃん達のツールです

2020-02-27 13:34:37
Tomoki Hasegawa @tomzoh

@lestrrat ジェネレーションギャップですね! (絶対ウソ)(本当に全く知らなかった)(何故だ…)

2020-02-27 13:35:30
nasa9084@某某某某(0x1e) @nasa9084

@tomzoh cronとかで定時実行したい、という前提で、かつ最近のOSでやるならsystemd timerに全部丸投げするのが一番楽だと思いますね

2020-02-27 11:43:39
Tomoki Hasegawa @tomzoh

@nasa9084 systems timerって重複起動まで面倒みてくれるんですか?(チョイ調べしたけどわからなかった)(その過程で flock を見つけてそれでいいのではとなった)(flock って OOM killer に殺されても解除されるのかな)

2020-02-27 11:48:14
nasa9084@某某某某(0x1e) @nasa9084

@tomzoh たぶん調べても「重複起動しない!」という情報は出てこないとは思うんですけど、それはそもそもsystemd timerの仕組み上「重複起動が基本的にできない」形になってるので、明記されることがない、という感じです

2020-02-27 11:51:58
Tomoki Hasegawa @tomzoh

@nasa9084 おー、なるほどー。あざます。

2020-02-27 11:58:35
カレー食べたい @mpyw

@tomzoh プロセスの多重起動をアドバイザリロックで防止する for PHP - Qiita qiita.com/ngyuki/items/5… これとかですかね

2020-02-27 16:41:56