Sintaxe do systemd para passar um parâmetro

Sintaxe do systemd para passar um parâmetro

Como posso obter o caminho atual como parâmetro? E como posso passar esse parâmetro para o 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

Responder1

Systemd não torna o diretório de trabalho acessível viaespecificadores, nem você pode usar variáveis ​​de ambiente na configuraçãoWorkingDirectory. Você pode usar variáveis ​​de ambiente em ExecStart, mas não para ocaminho de comando. Portanto, a menos que você use soluções alternativas, você terá que especificar o caminho pelo menos três vezes (observe que você deseja Environment=, não EnvironmentFile=):

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

Ou, em vez disso, envolva seu comando sh:

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

(Espero que você WORKDIRnão inclua espaços ou outros caracteres especiais.)

Ou, se você transformar a unidade em um modelo, poderá fazer:

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

E faça algo como:

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

Observe a barra inicial /antes do %I. O caminho para o executável deve ser absoluto, com ou sem especificadores, por isso precisamos usar /%I.

informação relacionada