開発環境サーバー関連その他技術系
更新日 : 2020年9月1日
投稿日 : 2020年6月24日

Cronなどbatch実行はroot、URL叩いて実行するのはapache

Cronなどbatch実行はroot、URL叩いて実行するのはapacheの画像

こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
私はPHPエンジニアとして7年~の経験があります。WordPressは2年半~の経験があります。その他、jQuery、HTML、CSSも使用します。
ここでは主に過去に納品した案件や自サイト運営(エンジニア婦人ノート)で遭遇したことについて書いています。

今回は「自動処理でファイルを作成、更新、削除などをしたいけれど、その権限周りで色々大変だった」話です。

先に結論

Cronのbatch処理をrootが行うように指定していても、URLを叩いて実行させてるとURLの実行者はapacheになる

というお話です。

やりたかったこと

  1. Cronで設定した、とあるプログラムを実行
  2. そこからURLを叩く。URL先ではPHPが実行され、ファイル操作が行われる。
  3. ファイル操作が行われて終了

書いてみると本当に単純なことがしたかっただけ…ですが、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様よ!なのになんでできないの!?と考えてしまいました。