web-dev-qa-db-ja.com

systemdサービスまたはtmpfiles.dでランタイムフォルダーを自動的に作成する方法

Djangoアプリケーション用のいくつかのGunicornソケット/ PIDファイル用に/run/gunicornにランタイムフォルダーを作成しようとしています。手動でディレクトリを作成すれば、すべてを機能させることができます。ただし、これを堅牢なセットアップにしようとしており、最終的にはすべてを自動化するためにAnsibleを使用しています。

私はこれに基づいて2つのオプションがあると思います question

オプション1-RuntimeDirectory

最初のオプションは、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.が表示されます。/run/gunicornフォルダーを手動で作成すると、動作するようになります。

オプション2-tmpfiles.d

2番目のオプションは、tmpfiles.dを使用して、起動時にフォルダーを作成し、pid /ソケットファイルを準備することです。私はこのファイルを試しました:

#/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

7
geonaut

推奨されるように、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

7
geonaut

私の問題は、同じRuntimeDirectoryisc-dhcp-serverおよびisc-dhcp-server6)ですが、機能するように構成したのは1つだけです。したがって、2番目のサービスが停止すると、そのランタイムディレクトリが削除され、最初のサービスで問題が発生しました。

0
Mitar