Cree un directorio en / var / run en el arranque

39

Tenía un demonio que necesitaba su propio directorio /var/runpara su archivo PID con permiso de escritura otorgado al usuario del demonio.

Descubrí que podía crear este directorio con estos comandos:

# mkdir /var/run/mydaemon

Entonces podría cambiar su propiedad al usuario / grupo bajo el cual deseaba ejecutar el proceso:

# chown myuser:myuser /var/run/mydaemon

¡Pero este directorio desaparecería cada vez que emita un reinicio! ¿Cómo consigo crear este directorio cada vez que la máquina arranca?

usuario24601
fuente

Respuestas:

56

Dos alternativas para que systemd cree directorios, generalmente la más fácil es declarar un RuntimeDirectoryarchivo de unidad de su servicio:

RuntimeDirectory=, RuntimeDirectoryMode= Toma una lista de nombres de directorio. Si se establece, se crearán uno o más directorios con los nombres especificados a continuación /run(para servicios del sistema) o por debajo de $ XDG_RUNTIME_DIR (para servicios de usuario) cuando se inicie la unidad y se eliminen cuando la unidad se detenga. Los directorios tendrán el modo de acceso especificado en RuntimeDirectoryMode=, y serán propiedad del usuario y el grupo especificado en User=y Group=. Use esto para administrar uno o más directorios de tiempo de ejecución de la unidad y vincular su vida útil al tiempo de ejecución del demonio. Los nombres de directorio especificados deben ser relativos y no pueden incluir un "/", es decir, debe referirse a directorios simples para crear o eliminar. Esto es particularmente útil para demonios no privilegiados que no pueden crear directorios de tiempo de ejecución en / run debido a la falta de privilegios, y para asegurarse de que el directorio de tiempo de ejecución se limpia automáticamente después de su uso.

O para directorios de tiempo de ejecución que requieren configuraciones más complejas o diferentes o garantías de por vida, use tmpfiles.dy haga que su paquete suelte un archivo /usr/lib/tmpfiles.d/mydaemon.conf:

 #Type Path            Mode UID      GID    Age Argument
 d     /run/mydaemon   0755 myuser myuser   -   -
HBruijn
fuente
Usé este último porque el demonio real usa el systemd-sysv-generatory he tenido suficientes curvas de aprendizaje para la semana. Solo ese archivo .conf y esa línea. Sentirse bien ahora B-)
user24601
Ya he definido este último en mi /usr/lib/tmpfiles.d/php7.3-fpm.confy /usr/lib/tmpfiles.d/php7.2-fpm.conftodavía no crea el /run/phpdirectorio.
MarthyM
3

Creé un servicio que haría el directorio al inicio:

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

Los contenidos 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

Entonces comencé este servicio:

systemctl start mydaemon-helper

systemctl status mydaemon-helper

Salida:

[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 último, le dije al sistema que lo cargara al inicio:

systemctl enable mydaemon-helper

usuario24601
fuente
Ok, supongo que debería haber puesto esto en mi pregunta considerando que soy un novato. Aunque estoy aprendiendo, ¡gracias a ustedes!
user24601
2
No, crear una respuesta fue lo correcto, para que la gente pueda comentar sobre ella y también para que no atesta su pregunta. Contestar sus propias preguntas se recomienda explícitamente en SO. Y su respuesta tampoco es incorrecta, es solo que hay formas mucho mejores de hacerlo, por lo que en mi opinión, no debería haber sido rechazado. Tampoco debería ser votado. :)
Bryan Larsen
2
Si bien RuntimeDirectoryes una mejor manera de hacerlo ahora , me encontré con un servidor con una versión anterior de systemd (208) donde esa directiva no existe, por lo que esta respuesta es la única solución.
Davor Cubranic
Esta también parece ser la forma de hacerlo si necesita un directorio creado y propiedad de un usuario diferente al usuario del servicio, o para que el directorio persista hasta el reinicio, o para que el directorio sea compartido entre múltiples servicios.
Perkins