Frage Erstellen Sie ein Verzeichnis unter / var / run beim Booten


Ich hatte einen Daemon, der sein eigenes Verzeichnis benötigte /var/run für seine PID-Datei mit Schreibberechtigung für den Benutzer des Daemon.

Ich habe herausgefunden, dass ich dieses Verzeichnis mit diesen Befehlen erstellen kann:

# mkdir /var/run/mydaemon

Dann könnte ich seinen Besitz an den Benutzer / die Gruppe ändern, unter der ich den Prozess ausführen wollte:

# chown myuser:myuser /var/run/mydaemon

Aber dieses Verzeichnis wäre GONE, wenn ich einen Neustart mache! Wie kann ich dieses Verzeichnis jedes Mal erstellen, wenn die Maschine bootet?


20
2018-05-29 03:08


Ursprung




Antworten:


Zwei Alternativen zum Erstellen von Verzeichnissen systemd. Am einfachsten ist es, ein Verzeichnis zu deklarieren RuntimeDirectory in der Einheitendatei Ihres Dienstes:

RuntimeDirectory=, RuntimeDirectoryMode=    Nimmt eine Liste von Verzeichnisnamen auf. Wenn gesetzt, werden darunter ein oder mehrere Verzeichnisse mit den angegebenen Namen erstellt /run (für Systemdienste) oder unter $ XDG_RUNTIME_DIR (für Benutzerdienste), wenn das Gerät gestartet wird, und entfernt, wenn das Gerät gestoppt wird. In den Verzeichnissen wird der Zugriffsmodus angegeben RuntimeDirectoryMode=, und gehört dem Benutzer und der Gruppe, die in angegeben sind User= und Group=. Verwenden Sie dies, um ein oder mehrere Laufzeitverzeichnisse der Unit zu verwalten und deren Lebensdauer an die Daemon-Laufzeit zu binden. Die angegebenen Verzeichnisnamen müssen relativ sein und dürfen keine "/B. auf einfache Verzeichnisse verweisen, um diese zu erstellen oder zu entfernen. Dies ist besonders nützlich für nicht privilegierte Daemons, die aufgrund fehlender Berechtigungen keine Laufzeitverzeichnisse in / run erstellen können und sicherstellen, dass das Laufzeitverzeichnis nach der Verwendung automatisch bereinigt wird.

Oder verwenden Sie für Laufzeitverzeichnisse, die komplexere oder andere Konfigurations- oder Lebensdauergarantien erfordern tmpfiles.d und Lass dein Paket eine Datei fallen lassen /usr/lib/tmpfiles.d/mydaemon.conf :

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

31
2018-05-29 06:24



Dies ist die richtige Antwort. - dawud
Ich habe Letzteres benutzt, weil der eigentliche Daemon den systemd-sysv-generator und ich hatte genug Lernkurven für die Woche. Nur diese eine .conf-Datei und diese eine Zeile. Fühle mich jetzt gut B-) - user24601


Ich habe einen Service erstellt, der den Anfang machen würde:

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

Die Inhalte von /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

Dann habe ich diesen Service begonnen:

systemctl start mydaemon-helper

systemctl status mydaemon-helper

Ausgabe:

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

Zuletzt habe ich dem System gesagt, es beim Start zu laden:

systemctl enable mydaemon-helper


2
2018-05-29 03:08



Ok, ich denke, ich hätte dies in meine Frage stellen müssen, wenn ich bedenke, dass ich so ein Noob bin. Ich lerne trotzdem - Danke an euch! - user24601
Nein, es war das Richtige, eine Antwort zu erstellen, damit die Leute sie kommentieren können, und damit Ihre Frage nicht unübersichtlich wird. Die Beantwortung Ihrer eigenen Fragen wird ausdrücklich zu SO angeregt. Und deine Antwort ist auch nicht falsch, es gibt einfach viel bessere Möglichkeiten, dies zu tun, also IMO, du hättest nicht abgelehnt werden sollen. Es sollte auch nicht aufgewertet werden. :) - Bryan Larsen
Während RuntimeDirectory ist eine bessere Möglichkeit, dies zu tun jetzt, Lief ich auf einen Server mit einer alten Version von Systemd (208), wo diese Direktive nicht existiert, so ist diese Antwort die einzige Problemumgehung. - Davor Cubranic
Dies scheint auch weiterhin der richtige Weg zu sein, wenn Sie ein Verzeichnis benötigen, das von einem anderen Benutzer als dem Benutzer des Dienstes erstellt wurde und dessen Verzeichnis beibehalten wird oder bis das Verzeichnis für mehrere Dienste freigegeben wird. - Perkins