web-dev-qa-db-fra.com

Créez un répertoire sous / var / run au démarrage

J'avais un démon qui avait besoin de son propre répertoire dans /var/run pour son fichier PID avec 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 pouvais changer sa propriété pour l'utilisateur/groupe sous lequel je souhaitais exécuter le processus:

# chown myuser:myuser /var/run/mydaemon

Mais ce dir serait GONE à chaque fois que je lance un redémarrage! Comment puis-je obtenir ce répertoire à créer à chaque démarrage de la machine?

44
user24601

Deux alternatives pour que systemd crée des répertoires, généralement la plus simple est de déclarer un RuntimeDirectory dans le fichier d'unité de votre service:

RuntimeDirectory=, RuntimeDirectoryMode= Prend une liste de noms de répertoires. S'il est défini, un ou plusieurs répertoires portant les noms spécifiés seront créés sous /run (pour les services système) ou inférieur à $ XDG_RUNTIME_DIR (pour les services utilisateur) lorsque l'unité est démarrée et supprimé lorsque l'unité est arrêtée. Les répertoires auront le mode d'accès spécifié dans RuntimeDirectoryMode=, et appartiendra à 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 à l'exécution du démon. Les noms de répertoire spécifiés doivent être relatifs et ne doivent 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 non privilégiés qui ne peuvent pas créer de répertoires d'exécution dans/run en raison d'un manque 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 qui nécessitent une configuration ou des garanties de durée de vie plus complexes ou différentes, utilisez tmpfiles.d et demandez à votre package de déposer un fichier /usr/lib/tmpfiles.d/mydaemon.conf:

 #Type Path            Mode UID      GID    Age Argument
 d     /run/mydaemon   0755 myuser myuser   -   -
63
HBruijn

J'ai créé un service qui ferait le dir 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

Ensuite, j'ai commencé ce service:

systemctl start mydaemon-helper

systemctl status mydaemon-helper

Production:

[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.

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

systemctl enable mydaemon-helper

5
user24601