如何使用 systemd 服务或 tmpfiles.d 自动创建运行时文件夹?

如何使用 systemd 服务或 tmpfiles.d 自动创建运行时文件夹?

我正在尝试为一些 Gunicorn 套接字/PID 文件创建一个运行时文件夹/run/gunicorn,这些文件用于 Django 应用程序。如果我手动创建目录,我就可以让一切正常工作。然而,我正在尝试使其成为一个强大的设置,并最终使用 Ansible 来自动化一切。

基于此,我想我有两个选择问题

选项 1 - 运行时目录

我认为第一个选项是在我的 systemd 服务文件中使用RuntimeDirectory=,但我无法让它创建文件夹。服务文件包含:

#/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.If I create /run/gunicornthefolder Manual, I can get things to work.

选项 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 服务器/systemd 229/Gunicorn 19.7.1/运行时目录=/run

答案1

我按照建议添加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

答案2

我的问题是我有两个服务使用相同的RuntimeDirectoryisc-dhcp-serverisc-dhcp-server6),但我只配置了一个可以工作。因此,当第二个服务死亡时,它的运行时目录被删除,这对第一个服务来说是一个问题。

相关内容