cronでPHPのタスクを定期的に起動したいが、すでにプロセスが動いている場合に起動しないようにしたい。
- PHPのタスクを実行する前に確認するタイプ
<?php /** * @param $process_command * @return bool */ public function checkDoubleProcess(string $process_command): bool { $output = []; exec("ps aux | grep -E \"{$process_command}$\" | grep -v sudo | grep -v grep", $output); return count($output) >= 2; } /** * 動かしたいタスク */ public function task() { //はじめにすでに起動していないかチェック if ($this->checkDoubleProcess("bash")) { exit; } //処理したい内容 }
こんな感じで、プロセス名に一致するものが返ってくるので数を数えているだけ。
<?php Array ( [0] => user 1161 0.0 0.2 115712 2312 pts/0 Ss 19:28 0:00 -bash )
- cronでlockファイルを作って多重起動を防ぐタイプ
0 * * * * apache /usr/bin/flock -n /tmp/process.lock php /src/task.php
今までわざわざ前者でやってたけど、crontabに書いたほうが楽だった