systemd 서비스 또는 tmpfiles.d를 사용하여 런타임 폴더를 자동으로 생성하는 방법은 무엇입니까?

systemd 서비스 또는 tmpfiles.d를 사용하여 런타임 폴더를 자동으로 생성하는 방법은 무엇입니까?

/run/gunicornDjango 응용 프로그램에서 사용되는 일부 Gunicorn 소켓/PID 파일에 대한 런타임 폴더를 만들려고 합니다 . 디렉토리를 수동으로 생성하면 모든 것이 잘 작동할 수 있습니다. 그러나 저는 이를 강력한 설정으로 만들고 결국 Ansible을 사용하여 모든 것을 자동화하려고 노력하고 있습니다.

이를 바탕으로 두 가지 옵션이 있다고 생각합니다.질문.

옵션 1 - 런타임 디렉터리

첫 번째 옵션은 시스템 서비스 파일에서 사용하는 것이지만 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 -

이렇게 하면 디렉터리가 생성되지만 빠르게 삭제되고 서비스를 시작하면 해당 폴더를 사용할 수 없습니다.

일부 PreExec 명령을 서비스 파일에 수동으로 추가할 수 있지만 mkdirRuntimeDirectory/tmpfiles.d가 작동하지 않는 이유를 알고 싶습니다. 감사해요.

버전/정보: Ubuntu 16.04 Server/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

RuntimeDirectory내 문제는 동일한 ( isc-dhcp-server및 )을 사용하는 두 개의 서비스가 있는데 isc-dhcp-server6하나만 작동하도록 구성했다는 것입니다. 따라서 두 번째 서비스가 종료되면 해당 런타임 디렉터리가 삭제되는데, 이는 첫 번째 서비스에 문제가 됩니다.

관련 정보