Ausführen von chdir vor dem Starten von systemd service

148

Frage: Kann ich einen Prozess mit systemd starten und diesem Prozess ein Arbeitsverzeichnis meiner Wahl zuweisen?

Ich habe einen Service, mit dem ich anfangen möchte systemd. Wenn dieser Dienst gestartet wird, möchte ich ihm ein aktuelles Arbeitsverzeichnis zuweisen können. Ich weiß, wie man das macht, wenn ich es benutzt habe init, aber ich habe Probleme damit systemd.

Hier ist, was ich versucht habe, um zu arbeiten.

Mein Service

Ich habe ein einfaches Hilfsprogramm ("listdir") erstellt, das in Python geschrieben und abgelegt wurde in /opt/bin/listdir:

#! /usr/bin/python

import os

print 'Current working directory: %s' % (os.getcwd())

Meine Konfigurationsdatei

Ich habe dann eine listdir.serviceDatei für erstellt systemdund diese hier abgelegt /lib/systemd/system/listdir.service:

[Unit]
Description=Test of listing CWD.

[Service]
ExecStartPre=chdir /usr/local
ExecStart=/opt/bin/listdir
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

Problem

Wenn ich systemctl start listdirmein Systemprotokoll ausführe , zeichnet es das Stammverzeichnis ("/") als aktuelles Arbeitsverzeichnis auf. Natürlich habe ich /usr/localals aktuelles Verzeichnis erwartet , da ich dachte ExecStartPreVerzeichnisse zu wechseln bevor ich den Prozess starte.

Offensichtlich stelle ich mir vor, das systemdwürde so etwas wie ein Shell-Skript funktionieren (obwohl ich weiß, dass es kein Shell-Skript ist). Kann mir jemand eine Idee geben, was ich tun soll? Ist es überhaupt möglich, mit ein Arbeitsverzeichnis einzurichten systemd? Vielen Dank!


Bearbeiten: Mein Systemprotokoll meldet einen Fehler. (I hab gerade gemerkt.)

Executable path is not absolute, ignoring: chdir /usr/local 

Ist chdiralso ein Shell-Befehl und keine ausführbare Datei. Okay. Aber gibt es noch eine Möglichkeit, mit Hilfe von Verzeichnisse zu wechseln systemd?

Mario
quelle

Antworten:

270

Auf systemd> = 227 sollten Sie verwenden können:

[Service]
WorkingDirectory=/usr/local

Damit Ihr Skript dort ausgeführt wird.

( DOCS )

Eric Renouf
quelle
4
Wie haben Sie das gefunden? Es wird nirgendwo in der Dokumentation erwähnt !
Jameshfisher
2
@ Jameshfisher es ist in diesem Teil der Dokumentation
Eric Renouf
3
@EricRenouf aha, sie sollten nur diese freigegebenen Optionen in der Service-Dokumentation
duplizieren
3
Würde dies der Übersichtlichkeit halber in den [Service]Abschnitt aufgenommen?
Donnerstag,
4
Ich antwortete, es funktionierte trotz der Version auf dem neuesten CentOS 7.
BrunoJCM