현재 셸의 환경 변수를 systemd 장치로 전달합니다.

현재 셸의 환경 변수를 systemd 장치로 전달합니다.

현재 셸에 정의된 환경 변수를 내가 systemd작성 중인 유닛 중 하나에 전달하려고 합니다.

DB_URL=databus.dev.mysite.io:8080

나는 이것을 서비스로 실행되는 Python 스크립트에서 사용하고 있습니다. 내 systemd유닛은 이 스크립트를 하나의 유닛으로 실행하고 이 변수를 사용하여 작업합니다.

[Unit]
Description=device-CompStatus: Computes device availability status
           
[Service]
Type=simple    
ExecStart=/usr/bin/bash -c "/usr/bin/python /opt/deviceCompStatus/deviceCompStatusHandler.py"
Restart=always
         
[Install]
WantedBy=default.target

Python 스크립트에서 변수를 사용하는 방법은 다음과 같습니다.

if os.environ.get('DB_URL') is not None:
    dbEndPoint = "http://" + os.environ['DB_URL']

문제는 스크립트를 실행할 때 변수를 사용할 수 없다는 것입니다 systemd. 몇 가지 리소스를 확인했습니다.시스템 단위에서 환경 변수 사용[Service], 할당을 다음 과 같이 직접 사용하라고 나와 있습니다 .

[Service]
Environment=DB_URL=databus.dev.mysite.io:8080

보시다시피, DB_URL내 컴퓨터를 배포하는 환경, 개발자 또는 프로덕션 설정에 따라 URL이 달라질 수 있으므로 변경될 수 있습니다.

이 작업을 어떻게 동적으로 수행할 수 있습니까? 즉, 사용 가능한 값을 DB_URL환경 에 전달합니까 systemd?

저도 사용해봤는데EnvironmentFile=파일을 정의하고 서비스에 전달하는 옵션입니다. 하지만 같은 문제가 다시 발생합니다. 내 변수는 동적일 수 있으며할 수 없다하드코딩되어 있습니다.

고쳐 쓰다

이 옵션을 사용한 후

systemctl import-environment DB_URL

systemd내가 확인한 환경에서 사용 가능한 변수를 확인할 수 있습니다.

systemctl show-environment
DB_URL=databus.dev.mysite.io:8080
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

python하지만 실행 중인 애플리케이션 에는 여전히 값이 반영되지 않습니다 . os.environ('DB_URL')변수에 접근하는 방법이 잘못됐나요?

답변1

다음을 사용하여 (재부팅할 때까지) 모든 향후 명령에 대해 전역 시스템 환경에 영향을 미칠 수 있습니다.

 sudo systemctl set-environment var=value

또는 이미 var환경에서 내보내는 경우 다음을 사용할 수 있습니다.

 sudo systemctl import-environment var

유사한 방법을 사용하여 장치를 시작한 후 unset-environment변수를 삭제할 수 있습니다.

DB_URL=databus.dev.mysite.io:8080이는 실제로 전역적이므로 해당 행을 일부 파일 에 작성 /some/file하고 EnvironmentFile=/some/file이를 유닛에 설정하는 것이 더 나을 것입니다 .

[email protected]또 다른 방법은 로 시작하는 템플릿 단위를 사용하는 것입니다 systemctl start myunit@'databus.dev.mysite.io:8080'. %i그런 다음 셀 내부(예: [Service]다음 행이 포함된 섹션) 내에서 이 매개변수를 복원 할 수 있습니다 .

Environment=DB_URL=%i

답변2

그만한 가치가 있는 경우 systemd의 자체 50-systemd-user.sh는 환경 변수 DISPLAY 및 XAUTHORITY를 가져오는 방법을 제공합니다. 다음을 참조할 수 있습니다.

#!/bin/sh                                                                                                                                                                                                    

systemctl --user import-environment DISPLAY XAUTHORITY

if command -v dbus-update-activation-environment >/dev/null 2>&1; then 
    dbus-update-activation-environment DISPLAY XAUTHORITY
fi

https://github.com/systemd/systemd/blob/master/xorg/50-systemd-user.sh

답변3

현재 터미널에서 환경 변수를 설정하고 로 내보내면 다음을 systemctl사용할 sudo수 있습니다.

sudo -E  systemctl import-environment <LIST OF ENVIRONMENTS TO BE AVAILABLE FOR SERVICE>

관련 정보