systemd 傳遞參數的語法

systemd 傳遞參數的語法

如何取得目前路徑作為參數?我該如何將此參數傳遞給 ExecStart?

[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

答案1

Systemd 不會使工作目錄可透過以下方式存取說明符,也不能在設定中使用環境變數WorkingDirectory。您可以在 中使用環境變量ExecStart,但不能用於命令路徑。因此,除非您使用解決方法,否則您必須至少指定路徑三次(請注意,您需要Environment=,而不是EnvironmentFile=):

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

或者,將您的命令sh換成:

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

(希望WORKDIR其中不包含空格或其他特殊字元。)

或者,如果您將該單元設為模板,您可以執行下列操作:

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

並做類似的事情:

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

/請注意之前的前導斜線%I。可執行檔的路徑必須是絕對路徑,有或沒有說明符,因此我們需要使用/%I.

相關內容