sintaxis de systemd para pasar un parámetro

sintaxis de systemd para pasar un parámetro

¿Cómo puedo obtener la ruta actual como parámetro? ¿Y cómo puedo pasar este parámetro al 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

Respuesta1

Systemd no hace que se pueda acceder al directorio de trabajo a través deespecificadores, ni puedes usar variables de entorno en la configuraciónWorkingDirectory. Puede utilizar variables de entorno en ExecStart, pero no pararuta de comando. Por lo tanto, a menos que utilice soluciones alternativas, deberá especificar la ruta al menos tres veces (tenga en cuenta que desea Environment=, no EnvironmentFile=):

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

O, en su lugar, incluya su comando en sh:

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

(Es de esperar que WORKDIRno incluya espacios ni otros caracteres especiales).

O, si convierte la unidad en una plantilla, puede hacer:

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

Y haz algo como:

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

Tenga en cuenta la barra diagonal /antes del %I. La ruta al ejecutable debe ser absoluta, con o sin especificadores, por lo que debemos usar /%I.

información relacionada