パラメータを渡すための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が、コマンドパスしたがって、回避策を使用しない限り、パスを少なくとも 3 回指定する必要があります ( では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

関連情報