事象
WEBアプリケーションでファイルを/tmp
に保存してダウンロードさせる機能を作ったのですがその際にサーバーに接続して/tmp
の中身を確認しても保存したものが表示されないということがありました。
アプリケーションからはファイルの存在は確認できるが、サーバーに接続して/tmp
を確認すると存在しないという感じです。
原因
インフラの方に聞いてみたところ、CentOS7からsystemdになった影響で/tmp
はサービス毎に実体が異なるようになったということでした(PrivateTmpという機能らしいです(デフォルトで有効))。
WEBアプリケーションで/tmp
に保存したものはWEBサーバーのサービスから保存したものになるのでそのサービスの/tmp
に保存されるということでした。
更に確認すると/tmp
ではなく以下に保存されていました。
/tmp/systemd-private-995039d4086a4e60b901dbfe2da2d4dd-php-fpm.service-XDbfC3/tmp/
対応
PrivateTmpを無効にするか、アプリケーション専用のtmpフォルダを作ってそこに保存する。
後者の場合は/tmp
の自動削除が機能しないので自動削除を設定するか、基本一時保存のものなので使い終わったら削除することを忘れない等の対策が必要です。
メモ
CentOS7からsystemdになったのでtempwatchがなくなってsystemd-tmpfiles-clean.timerになっています。
以下のコマンドでactiveかどうか確認できます。
systemctl status systemd-tmpfiles-clean.timer