Синтаксис 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.

Связанный контент