루트로 실행되는 서비스가 있습니다.
[Unit]
Description=my service
After=docker.service network-online.target
Requires=docker.service network-online.target
[Service]
TimeoutStartSec=0
RestartSec=60
Restart=always
User=root
Group=root
ExecStart=/usr/bin/myservice
[Install]
WantedBy=multi-user.target
예상치 못한 동작이 발생했습니다.
장애를 일으키는 환경변수를 살펴보니 $HOME
해당 환경변수가 ./root
myservice
그러나 루트로서 다음을 얻습니다.
$ echo $HOME
/home/root
이건 내가 본 것과 일치한다/etc/passwd
root:x:0:0:root:/home/root:/bin/sh
수동으로 실행 하면 myservice
올바른 $HOME
환경 변수가 얻어지고 작동합니다.
나는 $HOME
되고 싶지만 /home/root
그렇지 않다 /root
. 그래서...
- 어디서
systemd
가져오며/root
왜 덮어쓰나요$HOME
? systemd
$HOME
서비스 파일에서 환경 변수를 명시적으로 설정하는 것 외에 이것이 전역적으로 수행되는 것을 방지하려면 어떻게 해야 합니까 ? <-- 소스코드를 살펴보니 별 영향은 없는 것 같습니다.
답변1
소스 코드를 확인한 후 디렉토리가 systemd
실제로 사용자 home
를 위해 root
하드코딩 되어 있음을 발견했습니다. 이 설정을 변경하는 구성 문서를 찾지 못했기 때문에 기본 홈 디렉터리를 사용하는 Yocto 프로젝트에 대해 알아야 할 사항입니다.
/root
하드코딩된 값을 in으로 수정하여 /home/root
이를 확인했습니다 .https://github.com/systemd/systemd/blob/main/src/basic/user-util.csystemd
수정된 서비스가 올바른 변수로 생성되고 있음 을 관찰했습니다 $HOME
.
지금까지는 기호 링크가 좋은 해결 방법 /root
이었습니다 . /home/root
기본값을 ROOT_HOME
다음으로 전환하는 것은 /root
나쁜 생각이 아닐 수도 있습니다.나머지 Linux 세계와 보조를 맞추세요.