현재 셸에 정의된 환경 변수를 내가 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>