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 verwendenWorkingDirectory
Sie 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 sh
stattdessen wie folgt ein:
Environment='WORKDIR=/home/aaaa/bbbbb'
ExecStart=/bin/sh -c 'cd ${WORKDIR}; exec ${WORKDIR}/server --database:${WORKDIR}/cfg.json'
(Hoffentlich WORKDIR
enthä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
.