![systemd exec 명령 내에서 $(logname)을 어떻게 얻을 수 있나요?](https://rvso.com/image/170290/systemd%20exec%20%EB%AA%85%EB%A0%B9%20%EB%82%B4%EC%97%90%EC%84%9C%20%24(logname)%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%96%BB%EC%9D%84%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
저는 systemd 서비스( /etc/systemd/system/name.service
)를 작성 중입니다. 이 서비스는 에 있는 스크립트를 실행합니다 ~/folder/script.sh
. 명령어 ~/
내부에서는 사용할 수 없어서 ExecStart
사용하는데 /home/$(logname)/folder/script.sh
작동하지 않습니다.
답변1
Systemd는 쉘 환경보다 낮은 수준에서 작동합니다. 즉, 명령을 실행할 때 이는 일반적으로 init 데몬(이 경우 systemd)의 하위 프로세스인 셸 환경의 하위 프로세스입니다. 이는 시스템 장치가 쉘 환경이나 ~
. ~/.profile
또는 같은 파일에 구성된 환경 변수는 ~/.bashrc
적용되지 않습니다. 뭐를 보려고하다적용하려면 명령을 입력하면 됩니다 systemctl show-environment
. 내 시스템(Ubuntu Server 및 Arch)에서는 PATH
및 LANG
. 더 많은 정보여기.
이 모든 것은 사용자 단위에도 적용됩니다. 하지만 systemd는 에서 볼 수 있듯이 사용자 단위에 대해 약간 더 강력한 환경을 유지합니다 systemctl show-environment --user
. 마지막 명령을 실행했다면 수행해야 할 작업이 제공되어야 합니다. Systemd(적어도 내 시스템에서는)는 환경 변수를 USER
장치가 실행되는 사용자의 사용자 이름으로 설정합니다. 따라서 ExecStart 줄을 /home/${USER}/folder/script.sh
. 그렇게 해야 합니다. 또한 시스템 매뉴얼 페이지에 따르면 (
& ...를 사용하지 않았으므로 이는 필요하지 않습니다. )
중괄호( {
& }
)는 매우 이상한 이유로 사용자 이름에 공백이 있는 경우를 대비하여 사용됩니다. ${HOME}/folder/script.sh
사용자의 홈 디렉토리가 가 아닌 다른 곳에 있어도 작동하는 것을 사용할 수도 있습니다 /home/
.