如何使用 systemd 服務或 tmpfiles.d 自動創建執行時文件夾?
我正在嘗試
/run/gunicorn
為一些 Gunicorn 套接字/PID 文件創建一個執行時文件夾,這些文件用於 Django 應用程序。如果我手動創建目錄,我可以讓一切正常工作。但是,我正在嘗試使它成為一個健壯的設置,並最終使用 Ansible 來自動化一切。基於這個問題,我想我有兩個選擇。
選項 1 - 執行時目錄
我認為第一個選項是
RuntimeDirectory=
在我的 systemd 服務文件中使用,但我無法使用它來創建文件夾。服務文件包含:#/etc/systemd/system/gunicorn_django_test.service [Unit] Description=gunicorn_django daemon After=network.target [Service] User=gunicorn Group=www-data RuntimeDirectory=gunicorn #This line is supposed to create a directory RuntimeDirectoryMode=755 PIDFile=/run/gunicorn/django_test_pid WorkingDirectory=/vagrant/webapps/django_venv/django_test ExecStart=/vagrant/webapps/django_venv/bin/gunicorn --pid /run/gunicorn/django_test_pid --workers 3 --bind unix:/run/gunicorn/django_test_socket django_test.wsgi --error-logfile /var/log/gunicorn/django_test_error.log ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
當我執行
systemctl start gunicorn_django_test.service
時,服務無法啟動。當我剪掉 exec 行並手動執行它時,我得到Error: /run/gunicorn doesn't exist. Can't create pidfile.
如果我/run/gunicorn
手動創建文件夾,我可以讓事情正常工作。選項 2 - tmpfiles.d
第二個選項是使用
tmpfiles.d
在啟動時創建一個文件夾,為 pid / socket 文件做好準備。我試過這個文件:#/etc/tmpfiles.d/gunicorn.conf d /run/gunicorn 0755 gunicorn www-data -
這會創建一個目錄,但它會以某種方式很快被刪除,並且當我啟動服務時,該文件夾不可用。
我可以手動將一些 PreExec
mkdir
命令添加到服務文件中,但我想深入了解 RuntimeDirectory / tmpfiles.d 不起作用的原因。謝謝。版本/資訊:Ubuntu 16.04 Server / systemd 229 / Gunicorn 19.7.1 / runtime dir = /run
按照建議,我添加
PermissionsStartOnly=True
並為每個服務設置了一個執行時文件夾。我還添加0
到文件夾模式的開始。[Unit] Description=gunicorn_django daemon After=network.target [Service] PermissionsStartOnly=True User=gunicorn Group=www-data RuntimeDirectory=gunicorn_django RuntimeDirectoryMode=0775 PIDFile=/run/gunicorn_django/django_test_pid WorkingDirectory=/vagrant/webapps/django_venv/django_test ExecStart=/vagrant/webapps/django_venv/bin/gunicorn --pid /run/gunicorn_django/django_test_pid --workers 3 --bind unix:/run/gunicorn_django/django_test_socket django_test.wsgi --error-logfile /var/log/gunicorn/django_test_error.log ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target
它現在正在創建一個具有正確權限的文件夾。
drwxrwxrw- 2 gunicorn www-data 40 Mar 30 07:11 gunicorn_django/
謝謝@quixotic 和@mark-stosberg