Syntax von systemd zum Übergeben eines Parameters

Syntax von systemd zum Übergeben eines Parameters

Wie kann ich den aktuellen Pfad als Parameter erhalten? Und wie kann ich diesen Parameter an ExecStart übergeben?

[Unit]
Description="xxxxxxx"

[Service]
EnvironmentFile='WORKDIR=/home/aaaa/bbbbb/' #I want to get this path dynamically when I put this in another path.
WorkingDirectory=/home/aaaa/bbbbb
ExecStart=/home/aaaa/bbbbb/server --database:/home/aaaa/bbbbb/cfg.json
ExecStop=/bin/sleep 5
KillMode=process
KillSignal=SIGQUIT
Restart=always
RestartSec=5s
LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity
LimitNOFILE=64000
LimitNPROC=64000
TasksMax=infinity
TasksAccounting=false

[Install]
WantedBy=multi-user.target

Antwort1

Systemd macht das Arbeitsverzeichnis nicht zugänglich überSpezifizierer, noch können Sie Umgebungsvariablen in den Einstellungen verwendenWorkingDirectorySie können Umgebungsvariablen verwenden inExecStart , aber nicht für dieBefehlspfadWenn Sie also keine Workarounds verwenden, müssen Sie den Pfad mindestens dreimal angeben (beachten Sie, dass Sie wollen Environment=, nicht EnvironmentFile=):

Environment='WORKDIR=/home/aaaa/bbbbb'
WorkingDirectory=/home/aaaa/bbbbb
ExecStart=/home/aaaa/bbbbb/server --database:${WORKDIR}/cfg.json

Oder schließen Sie Ihren Befehl shstattdessen wie folgt ein:

Environment='WORKDIR=/home/aaaa/bbbbb'
ExecStart=/bin/sh -c 'cd ${WORKDIR}; exec ${WORKDIR}/server --database:${WORKDIR}/cfg.json'

(Hoffentlich WORKDIRenthält Ihr Text keine Leerzeichen oder andere Sonderzeichen.)

Wenn Sie die Einheit als Vorlage verwenden, haben Sie folgende Möglichkeiten:

Environment='WORKDIR=/%I'
WorkingDirectory=/%I
ExecStart=/%I/server --database:/%I/cfg.json

Und machen Sie etwas wie:

systemctl --user start my-service@home/aaaa/bbbbb.service

Beachten Sie den führenden Schrägstrich /vor dem %I. Der Pfad zur ausführbaren Datei muss absolut sein, mit oder ohne Spezifizierer, daher müssen wir verwenden /%I.

verwandte Informationen