Erstellen Sie ein Verzeichnis unter / var / run beim Booten

39

Ich hatte einen Daemon, der ein eigenes Verzeichnis /var/runfür seine PID-Datei benötigte, mit Schreibberechtigung, die dem Benutzer des Daemons erteilt wurde.

Ich habe festgestellt, dass ich dieses Verzeichnis mit den folgenden Befehlen erstellen kann:

# mkdir /var/run/mydaemon

Dann könnte ich den Besitzer in den Benutzer / die Gruppe ändern, unter dem / der ich den Prozess ausführen möchte:

# chown myuser:myuser /var/run/mydaemon

Aber dieses Verzeichnis ist GEGANGEN, wenn ich einen Neustart durchführe! Wie kann ich dieses Verzeichnis jedes Mal erstellen, wenn die Maschine hochfährt?

user24601
quelle

Antworten:

56

Es gibt zwei Alternativen, mit denen systemd Verzeichnisse erstellt. In der Regel ist es am einfachsten, RuntimeDirectoryin der Unit-Datei Ihres Dienstes Folgendes zu deklarieren :

RuntimeDirectory=, RuntimeDirectoryMode= Nimmt eine Liste von Verzeichnisnamen auf. Wenn festgelegt, werden ein oder mehrere Verzeichnisse mit den angegebenen Namen unterhalb /run(für Systemdienste) oder unterhalb von $ XDG_RUNTIME_DIR (für Benutzerdienste) beim Starten des Geräts erstellt und beim Stoppen des Geräts entfernt. Die Verzeichnisse werden den Zugriffsmodus in bestimmten haben RuntimeDirectoryMode=, und werden von der Benutzer- und Gruppen angegeben in Besitz sein User=und Group=. Verwenden Sie diese Option, um ein oder mehrere Laufzeitverzeichnisse des Geräts zu verwalten und deren Lebensdauer an die Daemon-Laufzeit zu binden. Die angegebenen Verzeichnisnamen müssen relativ sein und dürfen kein "/msgstr "" "muss sich zum Erstellen oder Entfernen auf einfache Verzeichnisse beziehen. 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.dund lassen Sie Ihr Paket eine Datei ablegen /usr/lib/tmpfiles.d/mydaemon.conf:

 #Type Path            Mode UID      GID    Age Argument
 d     /run/mydaemon   0755 myuser myuser   -   -
HBruijn
quelle
Ich habe letzteres verwendet, weil der eigentliche Daemon das verwendet systemd-sysv-generatorund ich genug Lernkurven für die Woche hatte. Nur diese eine .conf-Datei und diese eine Zeile.
Fühle mich
Ich habe bereits Letzteres in meinem /usr/lib/tmpfiles.d/php7.3-fpm.confund definiert /usr/lib/tmpfiles.d/php7.2-fpm.confund es erstellt immer noch nicht das /run/phpVerzeichnis.
MarthyM
3

Ich habe einen Dienst erstellt, mit dem das Verzeichnis beim Start erstellt wird:

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

Der Inhalt 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 gestartet:

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 das System angewiesen, es beim Start zu laden:

systemctl enable mydaemon-helper

user24601
quelle
Ok, ich denke, ich hätte das in meine Frage stellen sollen, da ich so ein Noob bin. Ich lerne aber - danke euch!
user24601
2
Nein, es war das Richtige, eine Antwort zu erstellen, damit die Leute sie kommentieren können und damit Ihre Frage nicht durcheinander gerät. Die Beantwortung Ihrer eigenen Fragen wird bei SO ausdrücklich empfohlen. Und Ihre Antwort ist auch nicht falsch. Es gibt einfach viel bessere Möglichkeiten, dies zu tun. IMO, Sie hätten nicht herabgestuft werden sollen. Es sollte auch nicht überstimmt werden. :)
Bryan Larsen
2
Obwohl RuntimeDirectorydies jetzt eine bessere Möglichkeit ist , bin ich auf einen Server mit einer alten Version von systemd (208) gestoßen, auf dem diese Direktive nicht existiert. Diese Antwort ist daher die einzige Problemumgehung.
Davor Cubranic
Dies scheint auch immer noch der richtige Weg zu sein, wenn Sie ein Verzeichnis benötigen, das von einem anderen Benutzer als dem Dienstbenutzer erstellt wurde und dessen Eigentümer dieser ist, oder wenn das Verzeichnis bis zum Neustart bestehen bleibt oder wenn das Verzeichnis von mehreren Diensten gemeinsam genutzt werden soll.
Perkins