こんにちは、さるまりんです。
今回はLaravelのバッチです。
バッチ内で特定のプロセスがいくつ実行中か知りたいことがありました。
それを取得するための関数を書いてみました。
function getNumOfRunningProcesses($processLine) {
// プロセス一覧を取得する
$process = new Process(['ps', '-ef']);
$process->run();
if (!$process->isSuccessful()) {
return false;
}
$output = explode("\n", $process->getOutput());
// 目的のプロセス($processLine)に一致する行を数える
$count = 0;
foreach ($output as $o) {
if (str_contains($o, $processLine)) $count++;
}
return $count;
}
new Process(['ps', '-ef'])
は環境によってオプションが違うかもしれません。
(今回はAmazon Linux 2上で試しました。)
また
if (str_contains($o, $processLine)) $count++;
は、「含まれるもの」を数えていますが、完全一致や他の条件に変えることもできると思います。
なんでこんなことをしたかの事情はこんな感じです。
重い処理を頻繁に起動したい
↓
重すぎるので処理を制限したい
↓
プロセス数で上限いってたいら処理を停止するように!
それを次のコードで行っています。
// プロセス数を取得
$running = $this->getNumOfRunningProcesses('php artisan myCommand');
if ($running === false) {
// プロセス数が取得できない場合はエラーとして終了
Log::error("could not get number of process, terminates");
return 0;
}
// 最大プロセス数を10とし
$maxProcess = 10;
if ($maxProcess < $running) {
// それを超えていたら処理を継続しない
Log::info("exceeding max process, terminates");
return 0;
}
// ... 実際の処理はここから
Laravelに用意されている仕組みでもっと簡単に取得できるのかもしれない(できないかもしれない)ですが、今回はこれで対応です。
読んでくださってありがとうございました。
それではまた!