以下圖,在開發調試的時候會遇到這麼一個問題。php
file_put_contents時,$tmp_file顯示的目標文件是/tmp/xxx.而這個文件實際放在linux的目錄倒是/tmp/systemd-private-xxxxx-php-fpm.service/xxx(見圖二)html
爲何會出現這種狀況?linux
只要使用Systemd這個進程做爲啓動進程的linux系統,其子進程都會有PrivateTmp這麼一個屬性,用於設置是否使用私有的tmp目錄。nginx
那麼只要設置使用這個屬性的service,都會使用私有的tmp目錄。centos
好比說:安全
nginx會有一個systemd-private-xxx-nginx.service/tmp目錄php-fpm
php-fpm會有一個systemd-private-xxx-php-fpm.service/tmp目錄post
使用PrivateTmp屬性有什麼好處嗎?spa
1. 見下圖,/tmp目錄通常是全部用戶和全部service都共享的,對於全部用戶和service來講,都會有寫和讀的權限。3d
那麼這裏會存在安全性的問題。把各個service的tmp目錄隔離開的話,能夠保證必定的安全性。
2.見下圖, 對於每一個service的tmp目錄,會在服務啓動(start)時建立該目錄,而且在關閉(stop)服務時刪除該目錄。若是咱們是使用本身定義的臨時目錄路徑的話,就須要咱們本身定義相關的維護機制了(如:按期刪除這些臨時文件等),而使用這個PrivateTmp的話,就不須要咱們本身去維護了。
怎麼設置這個PrivateTmp屬性呢?
打個比方,如今咱們要開啓 or 關閉 php-fpm 的這個屬性。
1. 利用systemctl找到對應的service路徑。
2 找到PrivateTmp並修改之。
ps:xx.service這種文件叫作unit文件,systemd把一個服務相關的啓動腳本叫作一個unit文件,若是要查看更多service文件的編寫規則,能夠搜索"systemd unit" or "systemd unit 文件編寫" 這類的關鍵字 or man systemd.unit 。
相關參考:
man systemd.exec 查找PrivateTmp關鍵字
https://lists.centos.org/pipermail/centos/2015-April/151589.html
http://0pointer.de/blog/projects/security.html