Créez un répertoire sous / var / run at boot

39

J'ai eu un démon qui avait besoin de son propre /var/runrépertoire pour son fichier PID avec l'autorisation d'écriture accordée à l'utilisateur du démon.

J'ai trouvé que je pouvais créer ce répertoire avec ces commandes:

# mkdir /var/run/mydaemon

Ensuite, je pourrais changer son propriétaire en utilisateur / groupe sous lequel je voulais exécuter le processus:

# chown myuser:myuser /var/run/mydaemon

Mais cette dir serait GONE chaque fois que je lance un redémarrage! Comment faire en sorte que ce répertoire soit créé à chaque démarrage de la machine?

utilisateur24601
la source

Réponses:

56

Il existe deux alternatives pour que systemd crée des répertoires, le plus simple étant généralement de déclarer un RuntimeDirectorydans le fichier unité de votre service:

RuntimeDirectory=, RuntimeDirectoryMode= Prend une liste de noms de répertoires. Si cette /runoption est définie, un ou plusieurs répertoires portant les noms spécifiés seront créés ci-dessous (pour les services système) ou inférieurs à $ XDG_RUNTIME_DIR (pour les services utilisateur) lors du démarrage de l'unité et supprimés lors de son arrêt. Les répertoires auront le mode d'accès spécifié dans RuntimeDirectoryMode=, et appartiendront à l'utilisateur et au groupe spécifié dans User=et Group=. Utilisez-le pour gérer un ou plusieurs répertoires d'exécution de l'unité et lier leur durée de vie au runtime du démon. Les noms de répertoire spécifiés doivent être relatifs et ne peuvent pas inclure de "/", c’est-à-dire doit faire référence à des répertoires simples à créer ou à supprimer. Ceci est particulièrement utile pour les démons sans privilèges qui ne peuvent pas créer de répertoires d’exécution dans / run en raison de l’absence de privilèges, et pour s’assurer que le répertoire d’exécution est nettoyé automatiquement après utilisation.

Ou, pour les répertoires d’exécution nécessitant une configuration plus complexe ou différente ou des garanties de durée de vie, utilisez tmpfiles.dvotre paquet et déposez-le dans un fichier /usr/lib/tmpfiles.d/mydaemon.conf:

 #Type Path            Mode UID      GID    Age Argument
 d     /run/mydaemon   0755 myuser myuser   -   -
HBruijn
la source
J'ai utilisé ce dernier parce que le démon utilise le systemd-sysv-generatoret j'ai eu assez de courbes d'apprentissage pour la semaine. Juste ce fichier .conf et cette ligne. Feelin bon en ce moment B-)
user24601
Ce dernier a déjà été défini dans mon fichier /usr/lib/tmpfiles.d/php7.3-fpm.confet /usr/lib/tmpfiles.d/php7.2-fpm.confne crée toujours pas le /run/phprépertoire.
MarthyM
3

J'ai créé un service qui ferait le répertoire au début:

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

Le contenu 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

Puis j'ai lancé ce service:

systemctl start mydaemon-helper

systemctl status mydaemon-helper

Sortie:

[[email protected] 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.

Enfin, j'ai dit au système de le charger au démarrage:

systemctl enable mydaemon-helper

utilisateur24601
la source
Ok, j'imagine que j'aurais dû l'inscrire dans ma question, étant donné que je suis un noob. J'apprends cependant - grâce à vous les gars!
user24601
2
Non, créer une réponse était la bonne chose à faire, pour que les gens puissent la commenter et pour que la question ne soit pas encombrée. La réponse à vos propres questions est explicitement encouragée sous SO. Et votre réponse n’est pas fausse non plus, c’est simplement qu’il existe de bien meilleurs moyens de le faire, alors vous ne devriez pas avoir à voter à l’OMI. Il ne devrait pas être voté non plus. :)
Bryan Larsen
2
Tout en RuntimeDirectoryest une meilleure façon de le faire maintenant , je suis tombé sur un serveur avec une ancienne version de systemd (208) où cette directive n'existe pas, cette réponse est la seule solution de contournement.
Davor Cubranic
Cela semble également être le moyen de le faire si vous avez besoin d'un répertoire créé et appartenant à un utilisateur différent de l'utilisateur du service, ou que le répertoire soit conservé jusqu'au redémarrage ou que le répertoire soit partagé entre plusieurs services.
Perkins