매개변수를 전달하는 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.

관련 정보