こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
PHPエンジニアとして9年~の経験があります。
今回は「自動処理でファイルを作成、更新、削除などをしたいけれど、その権限周りで色々大変だった」話です。
先に結論
Cronのbatch処理をrootが行うように指定していても、URLを叩いて実行させてるとURLの実行者はapacheになる
というお話です。
やりたかったこと
- Cronで設定した、とあるプログラムを実行
- そこからURLを叩く。URL先ではPHPが実行され、ファイル操作が行われる。
- ファイル操作が行われて終了
書いてみると本当に単純なことがしたかっただけ…ですが、2の「PHPが実行され、ファイル操作が行われる」ができませんでした。
ファイル操作ができなかった原因
調べてみたところ、URLを叩いて実行した先の実行者はapacheでした。
echo exec('whoami');
apache?root指定しているのに?
そう、URLを経由すると実行者がapahceになるんです。
ちょっと考えてみればわからなくもないですね。
サーバーでCron起動するのはrootです。rootがURLを踏みに行きますが、その踏んだ先で動作するのはrootではないんです。URLでPHPプログラム、みんな大好きapacheが実行することになるんです。
そのため、操作したいディレクトリやファイルの所有者がrootになっていると、apacheは操作できない。権限0777であればできますが、現実的ではありませんよね。
対処法
- ファイル操作するすべてのものの所有者をapacheにする
- ファイル操作をすべてrootで行うようにする
のどちらかになると思います。
まとめ
- Cronでroot実行していても、その仕組みによってはapacheが実行していることもある。
- 特にディレクトリやファイルを操作するようなプログラムを実行する場合、ユーザーがroot以外に変わっていることで操作が完了できない可能性が生じる。
わかってみれば「なるほどそういうことね!」となりますが、行きつくまでに少々時間がかかりました…ついrootで実行してるんだから全部できるはず、私はroot様よ!なのになんでできないの!?と考えてしまいました。