Ubuntu

如何使用 systemd 服務或 tmpfiles.d 自動創建執行時文件夾?

  • September 26, 2021

我正在嘗試/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 -

這會創建一個目錄,但它會以某種方式很快被刪除,並且當我啟動服務時,該文件夾不可用。

我可以手動將一些 PreExecmkdir命令添加到服務文件中,但我想深入了解 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

引用自:https://unix.stackexchange.com/questions/354583