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ê WORKDIR
nã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
.