systemd 서비스가 /etc/profile.d에서 환경 변수를 상속받도록 합니다.

systemd 서비스가 /etc/profile.d에서 환경 변수를 상속받도록 합니다.

systemd특정 사용자로 실행되는 서비스가 있습니다 .

서비스가 모든 사용자가 스크립트/내보내기에서 상속한 환경 변수에 액세스할 수 있을 것이라고 잘못 가정했습니다./etc/profile.d

systemd유닛 파일 정의 에서 변수를 수동으로 복사하지 않고도 이를 수행할 수 있는 방법이 있습니까?

예를 들어, 다음이 있습니다.

$ cat /etc/profile.d/somexports

export VAR1=VALUE1
export VAR2=VALUE2

이를 서비스에 전달/내보낼 수 있나요 systemd?

답변1

가능한 환경 소스는 다음과 같습니다.

  1. Environment=변수를 설정할 수 있는 것을 사용하면
  2. which를 사용하면 EnvironmentFile=파일에서 값을 로드할 수 있습니다.
  3. which를 사용하면 PassEnvironment=PID1에서 전달되어야 하는 변수를 정의할 수 있습니다.
  4. 정적 구성(예 $USER: )

당신이 원하는 것처럼 들릴 수도 있지만 EnvironmentFile=/etc/profile.d/someexports그렇지 않습니다. /etc/profile.d/*셸에서 제공되는 경우가 많으며 셸에서 구문 분석할 수 있습니다. systemd쉘에 구애받지 않으므로 bash 구문에 의존하지 않습니다. 에는 EnvironmentFile훨씬 더 엄격한 줄바꿈으로 구분된 변수 할당이 포함되어야 합니다.

systemd의 디자인은 유닛이나 환경이 동적으로 변화하는 것을 방지합니다. 옵션 조차도 EnvironmentFile=압력의 결과로 추가되었으며 나중에 의 systemd개발자에 의해 실수로 간주되었습니다. 이 디자인의 한 가지 예는 $PATH사용되는 바이너리에 영향을 주지 않는다는 것입니다. 이는 단위를 정의할 때 외부 영향에 대해 걱정하지 않고 해당 단위가 어떻게 실행되어야 하는지에 대한 모든 것을 정의하므로 상황을 더욱 결정적으로 유지합니다.

짧은 대답은 다음과 같습니다. 아니요. 로드할 수 없으며 /etc/profile.d/*이는 systemd의도적인 것입니다.

하지만 아마도 여러분이 원하는 대답은 다음과 같습니다. 예, 로드할 수 있습니다. 셸을 통해 애플리케이션을 실행하기만 하면 됩니다.

다음을 변경하여 그렇게 할 수 있습니다.

ExecStart=/usr/bin/myservice

에게

ExecStart=/usr/bin/bash -lc myservice

이는 해당 환경을 bash로드하고 하위 프로세스에 전달하는 상위 프로세스가 됩니다 . /etc/profile.d/또한 myservice. 이 경우 는 을 myservice기반으로 하며 $PATH가 될 수도 있고 아닐 수도 있습니다 /usr/bin/myservice. 이로 인해 문제 해결이 어떻게 더 어려워질 수 있는지 알 수 있으며 이것이 이 경로를 따르는 단점입니다.

답변2

이 문제는 다음과 같이 해결될 것 같습니다

ExecStart=/bin/sh -lc /path/to/binary

플래그 -l는 쉘 호출을 로그인 쉘로 만듭니다. 로그인 셸만 소스 프로필 스크립트를 사용하기 때문에 이것이 필요합니다.

$ bash --help | grep -- -l
GNU bash, version 4.4.12(1)-release-(x86_64-pc-linux-gnu)
    --login

관련 정보