O systemd pode fazer alguma configuração antes de se bifurcar como usuário?

4

Tendo escrito vários pequenos daemons ou aplicativos da web para meu uso pessoal, gosto de gerenciá-los usando o systemd (estou usando o Arch Linux, se isso for importante). Então eu escrevo arquivos de serviço como o abaixo:

[Unit]
Description=My example daemon

[Service]
Type=forking
User=example_user
ExecStart=/path/to/my_executable
ExecStop=kill -QUIT $MAINPID
PIDFile=/var/run/example/example.pid

[Install]
WantedBy=multi-user.target

my_executable falha ao iniciar se não puder gravar seu arquivo PID, o que geralmente significa que o diretório /var/run/example/ não existe. Isso acontece após cada reinicialização, pois tenho /var/run de um tempfs.

Uma solução é iniciar o my_executable como root e deixá-lo cair nos direitos de acesso corretos depois de criar seu ambiente, mas não estou muito confortável com isso, já que não confio em mim mesmo para fazer isso corretamente.

Existe uma maneira de fazer o systemd fazer o trabalho pesado aqui (talvez especificando outro script que deve ser executado antes de executar o ExecStart)? Qual é o melhor caminho?

    
por Jens 10.01.2014 / 12:06

2 respostas

6

systemd fornece systemd-tmpfiles para esse fim exato. O serviço systemd-tmpfiles lida com a criação, limpeza e remoção de arquivos e diretórios temporários e temporários que geralmente residem em diretórios como /run ou /tmp . A configuração de systemd-tmpfiles é descrita na página de manual de tmpfiles.d 1 .

Crie um arquivo de configuração systemd-tmpfiles para seu serviço em um dos caminhos de configuração, por exemplo, %código%. O formato do arquivo de configuração é uma linha por caminho, da forma:

type path mode ownership age argument

Por exemplo, a linha

d /var/run/example 0755 example_user - -

informa ao etc/tmpfiles.d para criar o diretório systemd-tmpfiles de propriedade de /var/run/example , se ele já não existir.

1 O artigo wiki do Arch Linux sobre example_user também fornece alguns exemplos sobre% configuraçãosystemd.

    
por 10.01.2014 / 12:46
0

Para sua situação exata, o arquivo de serviço seria algo como isto:

[Unit]
Description=My example daemon

[Service]
Type=forking
User=example_user
# Run ExecStartPre with root permissions
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir /var/run/example
ExecStartPre=/bin/chown -R example_user /var/run/example/
# Run ExecStart with example_user permissions
ExecStart=/path/to/my_executable
ExecStop=kill -QUIT $MAINPID
PIDFile=/var/run/example/example.pid

[Install]
WantedBy=multi-user.target

( fonte )

Nota: talvez você queira verificar os caminhos para chown e mkdir primeiro.

    
por 30.07.2016 / 11:07