특정 서비스에 대한 환경 변수를 내보낼 수 있나요?

특정 서비스에 대한 환경 변수를 내보낼 수 있나요?

두 개의 서비스가 있다고 가정해 보겠습니다. 이는 시스템(Ubuntu 16.04.3)이 시작될 때 자동으로 시작되는 두 개의 프로세스입니다.

서비스 문서:

[Unit]
Description=service 1
Requires=init_mdc.service
After=rc.local.service init_mdc.service


[Service]
ExecStart=someCmd
ExecReload=someCmd
KillMode=process
Restart=on-failure
Type=simple

다른 서비스 파일:

[Unit]
Description=service 2
Requires=init_mdc.service
After=rc.local.service init_mdc.service


[Service]
ExecStart=someCmd2
ExecReload=someCmd2
KillMode=process
Restart=on-failure
Type=simple

두 서비스 모두 동일한 환경 변수 중 일부가 필요합니다.

someCmd두 서비스에 대한 s는 동일한 env 변수를 설정하는 두 개의 서로 다른 bash 스크립트이기 때문에 현재 내 솔루션은 좋지 않습니다 .

두 서비스가 공유할 수 있도록 어딘가에 일부 환경 변수를 설정할 수 있는지 궁금합니다. 즉, 환경 변수를 두 번이 아닌 한 번만 설정하고 싶습니다.

/etc/profile에서 이러한 환경 변수를 내보내 려고 했지만 /etc/rc.local작동하지 않습니다. 이는 시스템이 두 가지 서비스를 먼저 실행한 다음 시스템에서 이를 읽기 /etc/profile때문 이라고 생각합니다./etc/rc.local

여러 서비스 파일에 대해 일부 환경 변수를 설정할 수 있는 방법이 있습니까? 일부 환경 변수를 가져오기 위해 서비스 파일에서 설정할 수 있다는 것을 알고 있지만 EnvironmentFile=XXX각 서비스에 대해 여러 번 설정 해야 하기 때문에 이것이 마음에 들지 않습니다 .EnvironmentFile=XXX

답변1

사용하는 EnvironmentFile=것이 방법입니다.

여러 번 설정해야 한다는 점을 이해하지 못합니다. 이러한 변수가 필요한 각 서비스에서 한 번만 설정해야 합니다.

서비스 1:

[Unit]
Description=service 1

[Service]
ExecStart=someCmd
EnvironmentFile=/path/to/common.env
...

서비스 2:

[Unit]
Description=service 2

[Service]
ExecStart=someCmd2
EnvironmentFile=/path/to/common.env
...

모든 VAR=VALUE설정을 파일에 저장합니다 /path/to/common.env.

환경 파일의 구문은 쉘 스크립트의 구문과 호환되므로 자신의 환경에서도 얻을 수 있습니다..bash_profile

# ~/.bash_profile
if [ -f /path/to/common.env ]; then
    . /path/to/common.env
fi

대안은 PID 1에서 전역 환경 변수를 사용 systemctl set-environment하거나 설정하는 것입니다. systemctl import-environment(문서 참조여기.)

특정 서비스에서 이러한 변수를 내 보내야 할 수도 있지만 PassEnvironment=이 경우 변수 이름만 나열하면 됩니다.

저는 이것이 최선의 솔루션이라고 생각하지 않습니다. EnvironmentFile=더 독립적이고 우아하며 귀하의 사용 사례에 적합하다고 생각합니다.

관련 정보