서비스 를 만들려고 합니다 systemd
.
서비스에는 일부 환경 변수를 사용해야 하는 스크립트가 있습니다.
그래서 저는 이것을 만들었습니다:
cat /etc/systemd/system/atlantis-server.service
[Service]
ExecStart=/usr/local/bin/atlantis-server.sh
이는 다음을 보여줍니다.
pkara@atlantis-server:~$ cat /usr/local/bin/atlantis-server.sh
#!/bin/bash
source /etc/environment
atlantis server --atlantis-url="$URL" --gitlab-user="$USERNAME" --gitlab-token="$TOKEN" --gitlab-webhook-secret="$SECRET" --gitlab-hostname="$HOSTNAME" --repo-whitelist="$REPO_WHITELIST"
나는 (내 systemd
로그에 몇 가지 오류가 발생한 후) 명시적으로 해야 한다는 것을 알았습니다.source /etc/environment
(여기서 위의 변수가 선언됩니다.)
이것이 왜 필요한가요?
전 세계적으로 표시되지 않습니까?
편집하다: 이를 서비스 정의에 추가해도 문제가 해결되지 않았습니다.
Environment=/etc/environment
답변1
/etc/environment
전역 구성 파일이 아닙니다.
적용됩니다오직리눅스에서는;오직login
사용되는 것과 같은 PAM 세션에오직특정 PAM 플러그인이 시스템에 설치되어 활성화되어 있고 해당 PAM 플러그인이 다른 파일을 사용하도록 구성되지 않은 경우( /etc/environment
달리 명시하지 않는 한 이는 단지 기본값이기 때문입니다). 이를 읽는 것은 PAM 플러그인입니다.
그렇지 않으면 아무런 목적도 없는 무의미한 파일일 뿐입니다 /etc
.
때를할 수 있다systemd-system.conf
전역적 으로 환경 변수 설정모두변경하려는 서비스뿐만 아니라 서비스도 마찬가지입니다.
마찬가지로 EnvironmentFile
systemd의 적절한 서비스 단위에는 환경 변수 정의 목록이 포함된 공용 파일을 읽을 수 있는 방법이 있지만 systemd에서는 해당 서비스 단위를 사용하지 않는 것이 좋습니다. 그들은 EnvironmentFile
그것이 나쁜 생각이라고 생각하고 그 사용을 실수로 간주합니다.
모든 시스템 사용자가 이를 수행하는 올바른 방법은 Environment
서비스 단위의 모든 변수를 다음과 같은 설정으로 설정하는 것 입니다.실제 환경 변수 이름과 값을 포함합니다.파일 이름이 아닌 설정됩니다. 자체 서비스 단위를 작성하여 여기에 배치하는 경우 관련 서비스 단위에 직접 배치할 수 있고 , 또는 미리 패키지된 서비스 단위를 /etc
적용하는 경우 오버레이 파일에 배치할 수 있습니다 ..conf
/lib
/usr/lib
추가 읽기
- https://unix.stackexchange.com/a/419061/5132
- Lennart Petlinget al. (2016).
systemd-system.conf
. 시스템 매뉴얼 페이지. freedesktop.org. - Lennart Petlinget al. (2016).
systemd.exec
. 시스템 매뉴얼 페이지. freedesktop.org. - Andrew G. Morgan 및 Thorsten Kukuk(2010년 8월). "pam_env — 환경 변수 설정/설정 해제". Linux-PAM 시스템 관리자 가이드. linux-pam.org.
답변2
다음은 무엇을 명확히 하기 위한 것입니다./etc/환경쿼리할 때 is/dos이며 어떤 패키지가 이를 제공하는지:
whereis /etc/environment
environment: /usr/lib/environment.d /etc/environment
위의 결과를 종합하여 whereis
확인합니다./etc/환경는시스템 D문서:
sudo dpkg -S /usr/lib/environment.d
systemd, snapd: /usr/lib/environment.d
상담 후 man environment.d
목적을 알아보세요/etc/환경:
"환경.d 디렉토리사용자 환경에 대한 "전역" 환경 변수 할당 목록이 포함되어 있습니다. systemd-environment-d-generator(8)는 이를 구문 분석하고 systemd 사용자 인스턴스가 내보낸 환경을 시작한 서비스로 업데이트합니다.....이전 버전과의 호환성을 위해 심볼릭 링크는 다음과 같습니다./etc/환경설치되었으므로 파일도 구문 분석됩니다."
답변3
이전 답변에서 볼 수 있듯이 Systemd는 서비스를 시작할 때 이 파일을 가져오지 않습니다.
이를 서비스 정의에 추가해도 문제가 해결되지 않았습니다.
Environment
환경 변수의 인라인 정의(예 Environment=KEY1=Value1
: ) 파일에서 읽으려면 EnvironmentFile
지시문을 사용하십시오. 가리키는 파일은 EnvironmentFile
다음 형식이어야 합니다.
Key1=Value1
Key2=Value2
어떤 것도 포함해서는 안 됩니다.쉘 교체또는변수 보간Systemd는 셸이 아니기 때문에 이 메시지를 올바르게 처리할 수 없습니다.
답변4
아니요, 환경 변수는 스레드별 속성이므로 전역적으로 표시되지 않으며 일부 상위 또는 상위 프로세스에서 상속됩니다. Systemd는 시스템 서비스를 시작할 때 이 파일을 읽지 않습니다.