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?
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é dansRuntimeDirectoryMode=
, et appartiendra à l'utilisateur et au groupe spécifié dansUser=
etGroup=
. 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 - -
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