Crie um diretório em / var / run na inicialização

39

Eu tinha um daemon que precisava de seu próprio diretório /var/runpara seu arquivo PID com permissão de gravação concedida ao usuário do daemon.

Eu descobri que poderia criar este diretório com estes comandos:

# mkdir /var/run/mydaemon

Então eu poderia mudar sua propriedade para o usuário / grupo sob o qual desejei executar o processo:

# chown myuser:myuser /var/run/mydaemon

Mas este dir seria ido sempre que eu emitir uma reinicialização! Como faço para que esse diretório seja criado toda vez que a máquina é inicializada?

user24601
fonte

Respostas:

56

Duas alternativas para que o systemd crie diretórios, normalmente o mais fácil é declarar um RuntimeDirectoryno arquivo de unidade do seu serviço:

RuntimeDirectory=, RuntimeDirectoryMode= Leva uma lista de nomes de diretório. Se definido, um ou mais diretórios com os nomes especificados serão criados abaixo /run(para serviços do sistema) ou abaixo de $ XDG_RUNTIME_DIR (para serviços do usuário) quando a unidade for iniciada e removidos quando a unidade for parada. Os diretórios terão o modo de acesso especificado em RuntimeDirectoryMode=e pertencerão ao usuário e grupo especificados em User=e Group=. Use isso para gerenciar um ou mais diretórios de tempo de execução da unidade e vincular sua vida útil ao daemon runtime. Os nomes de diretório especificados devem ser relativos e não podem incluir um "/", ou seja, deve se referir a diretórios simples para criar ou remover. Isso é particularmente útil para daemons sem privilégios que não podem criar diretórios de tempo de execução em / executados devido à falta de privilégios e para garantir que o diretório de tempo de execução seja limpo automaticamente após o uso.

Ou, para diretórios de tempo de execução que exijam garantias de configuração ou vida útil mais complexas ou diferentes, use tmpfiles.de faça com que seu pacote solte um arquivo /usr/lib/tmpfiles.d/mydaemon.conf:

 #Type Path            Mode UID      GID    Age Argument
 d     /run/mydaemon   0755 myuser myuser   -   -
HBruijn
fonte
Eu usei o último porque o daemon real usa o systemd-sysv-generatore tive curvas de aprendizado suficientes para a semana. Apenas aquele arquivo .conf e essa linha. Feelin bom agora B-)
user24601
Eu já tive o último definido no meu /usr/lib/tmpfiles.d/php7.3-fpm.confe /usr/lib/tmpfiles.d/php7.2-fpm.confainda não cria o /run/phpdiretório.
MarthyM
3

Eu criei um serviço que faria o dir no início:

vim /etc/systemd/system/mydaemon-helper.service

O conteúdo de /etc/systemd/system/mydaemon-helper.service:

[Unit]
Description=MyDaemon Helper Simple Service
After=network.target

[Service]
Type=simple
ExecStartPre=-/usr/bin/mkdir /var/run/mydaemon
ExecStart=/usr/bin/chown myuser:myuser /var/run/mydaemon
Restart=on-abort


[Install]
WantedBy=multi-user.target

Então eu iniciei este serviço:

systemctl start mydaemon-helper

systemctl status mydaemon-helper

Saída:

[root@alpha etc]# systemctl status mydaemon-helper.service
● mydaemon-helper.service - MyDaemon Helper Simple Service
   Loaded: loaded (/etc/systemd/system/mydaemon-helper.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

May 28 20:53:50 alpha systemd[1]: Starting MyDaemon Helper Simple Service...
May 28 20:53:50 alpha systemd[1]: Started MyDaemon Helper Simple Service.

Por fim, eu disse ao sistema para carregá-lo na inicialização:

systemctl enable mydaemon-helper

user24601
fonte
Ok, acho que deveria ter colocado isso na minha pergunta, considerando que sou um noob. Estou aprendendo - graças a vocês!
User24601
2
Não, criar uma resposta foi a coisa certa a ser feita, para que as pessoas possam comentar sobre ela e também para que ela não atrapalhe sua pergunta. Responder a suas próprias perguntas é explicitamente encorajado no SO. E sua resposta também não está errada, é apenas que existem maneiras muito melhores de fazer isso, portanto, na OMI, você não deveria ter sido votado negativamente. Também não deve ser votado. :)
Bryan Larsen
2
Embora RuntimeDirectoryseja a melhor maneira de fazer isso agora , encontrei um servidor com uma versão antiga do systemd (208) onde essa diretiva não existe, portanto, essa resposta é a única solução alternativa.
Davor Cubranic
Essa também parece ser a maneira de fazê-lo se você precisar de um diretório criado e de propriedade de um usuário diferente do usuário do serviço, ou para que o diretório persista até a reinicialização ou para que o diretório seja compartilhado entre vários serviços.
Perkins