質問: ### 前提・実現したいこと PHPで作成したBOTをMacのローカル環境で定期実行をしたいが、launchdで動かすとPermission deniedでエラーとなる ### 発生している問題・エラーメッセージ テスト用にテキストファイルを書き出すスクリプト(index.php)を作成しました。 ターミナルで手動で正常動作を確認した上で、 launchdを使用して定期実行を試したところ動作せず、下記のエラーが出て困っています。 エラーメッセージ Warning: file_put_contents(phpOutput.txt): failed to open stream: Permission denied in /Applications/MAMP/htdocs/hoge/index.php on line 5 ご回答の程、よろしくお願いいたします。 ### 該当のソースコード [PHP] [plist] Label phpTest ProgramArguments /Applications/MAMP/bin/php/php7.1.6/bin/php /Applications/MAMP/htdocs/hoge/index.php StartInterval 15 StandardOutPath /Applications/MAMP/htdocs/hoge/output.txt StandardErrorPath /Applications/MAMP/htdocs/hoge/error.txt ### 試したこと [動作の確認] ・設定した間隔(15秒)毎に、(Warning: file_put_contents(phpOutput.txt): failed to open stream: Permission denied in )が表示される ・ブラウザとターミナルからindex.phpを実行→正常動作 ・よって、launchdは定期実行しようとしているが、アクセス権限の不備で動作していない [/htdocs/hoge/配下の権限の確認] ・/Applications/MAMP/htdocs/hoge/配下のpermissionは(755)だった ・phpOutput.txtのpermissionをchmodで666に変更 →エラーの状態変わらず [launchdをrootで実行] ・sudo luanchctl load hoge.plistを実行。(Path had bad ownership/permissions)とエラーが出たため、ownerとgroupを、admin,staff→root,wheelに変更 ・sudo luanchctl load hoge.plistを実行。実行エラーは出なくなったが、index.phpは動作せず。←今ここ ### 補足情報(言語/FW/ツール等のバージョンなど) ・使用環境:MacOS Sierra バージョン 10.12.6 ・使用言語:PHP 7.1.6 ・hoge.plistの配置場所:~/Library/LaunchAgents/hoge.plist ・index.phpの配置場所:~/Applications/MAMP/htdocs/hoge/index.php
回答: plist / エラーメッセージ の中と 補足情報に書かれている index.php の PATH が、異なりますが、どちらが正しいですか? とりあえず、エラーメッセージのパスが正しい PATH と仮定して回答します。 Mac OS の launchd から起動されるプログラムは、**ログインユーザーで実行されて、カレントディレクトリは、 / (ルートディレクトリ)になる**と思います。 そのため、 / に phpOutput.txt を作ろうとして、「file_put_contents(phpOutput.txt): failed to open stream: Permission denied」のエラーが発生しているのではないかと推測します。 プログラムに対し、以下の変更をしたらどうなるでしょうか? 1. $file = 'phpOutput.txt'; を $file = '/Applications/MAMP/htdocs/hoge/phpOutput.txt'; の様にすべてのファイルパスを / (ルートディレクトリ)からのフルパスで、記入したらどうなるでしょうか? 2. フルパスでも NG の場合、$file = '/Users/アカウント名/phpOutput.txt'; のように ホームディレクトリの下の場所で、フルパスに変更したらどうなるでしょうか?