Como criar automaticamente uma pasta de tempo de execução com um serviço systemd ou tmpfiles.d?

6

Estou tentando criar uma pasta de tempo de execução em /run/gunicorn para alguns arquivos de soquete / PID de Gunicorn, que são para um aplicativo Django. Eu posso fazer tudo funcionar se eu criar diretórios manualmente. No entanto, estou tentando tornar isso uma configuração robusta e, eventualmente, usar o Ansible para automatizar tudo.

Acho que tenho duas opções, baseadas neste pergunta .

Opção 1 - RuntimeDirectory

Acho que a primeira opção é usar RuntimeDirectory= dentro do meu arquivo de serviço systemd, mas não consigo criar a pasta. Os arquivos de serviço contém:

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

Quando executo systemctl start gunicorn_django_test.service , o serviço falha ao iniciar. Quando eu pego a linha exec e executo-a manualmente, recebo Error: /run/gunicorn doesn't exist. Can't create pidfile. Se eu criar manualmente a pasta /run/gunicorn , posso fazer as coisas funcionarem.

Opção 2 - tmpfiles.d

A segunda opção é usar tmpfiles.d para ter uma pasta criada na inicialização, pronta para os arquivos pid / socket. Eu tentei este arquivo:

#/etc/tmpfiles.d/gunicorn.conf
d /run/gunicorn 0755 gunicorn www-data -

Isso cria um diretório, mas é rapidamente excluído de alguma forma e, quando eu inicio o serviço, a pasta não está disponível.

Eu posso adicionar manualmente alguns comandos do PreExec mkdir ao arquivo de serviço, mas gostaria de saber por que RuntimeDirectory / tmpfiles.d não está funcionando. Obrigado.

Versões / Informações: Ubuntu 16.04 Server / systemd 229 / Gunicorn 19.7.1 / tempo de execução dir = / run

    
por geonaut 29.03.2017 / 15:38

1 resposta

3

Eu adicionei em PermissionsStartOnly=True e defini uma pasta de tempo de execução por serviço, conforme sugerido. Eu também adicionei 0 ao início do modo de pasta.

[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

Agora está criando uma pasta com as permissões corretas.

drwxrwxrw-  2 gunicorn www-data   40 Mar 30 07:11 gunicorn_django/

Obrigado @quixotic e @ mark-stosberg

    
por 30.03.2017 / 09:16