LaravelのControllerで、あるコマンドをphpのexec()を使ってバックグラウンドで実行しようとしたところ、どうやってもバックグラウンドで実行されません。具体的なコードは以下のとおりです。exec()とnohupでpythonのスクリプトを実行するコードです。
public function start()
{
$cmd = PYTHON3_PATH.'/python3 '.BIN_PATH.'/run_proc.py ';
$cmd_bg = "nohup " . $cmd . " 1>> std.log 2>> error.log&";
exec($cmd_bg,$out,$stat);
if ($stat == 0) {
$fn = SPOOL_PATH.'/split.pid';
file_put_contents($fn,$out[0]);
return 'OK';
} else {
return "Error";
}
}
原因
Laravelのビルドイン開発サーバを使っているのが原因でした。次のようなコマンドで開発サーバを起動し、そのサーバからコントローラを呼び出すとバックグラウンドで実行されないようです。
php artisan serve
apacheのサーバに切り替えると、問題なくバックグラウンドで実行されるようになりました。