/etc/environment전역 구성 파일이 아닙니다.

/etc/environment전역 구성 파일이 아닙니다.

서비스 를 만들려고 합니다 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전역적 으로 환경 변수 설정모두변경하려는 서비스뿐만 아니라 서비스도 마찬가지입니다.

마찬가지로 EnvironmentFilesystemd의 적절한 서비스 단위에는 환경 변수 정의 목록이 포함된 공용 파일을 읽을 수 있는 방법이 있지만 systemd에서는 해당 서비스 단위를 사용하지 않는 것이 좋습니다. 그들은 EnvironmentFile그것이 나쁜 생각이라고 생각하고 그 사용을 실수로 간주합니다.

모든 시스템 사용자가 이를 수행하는 올바른 방법은 Environment서비스 단위의 모든 변수를 다음과 같은 설정으로 설정하는 것 입니다.실제 환경 변수 이름과 값을 포함합니다.파일 이름이 아닌 설정됩니다. 자체 서비스 단위를 작성하여 여기에 배치하는 경우 관련 서비스 단위에 직접 배치할 수 있고 , 또는 미리 패키지된 서비스 단위를 /etc적용하는 경우 오버레이 파일에 배치할 수 있습니다 ..conf/lib/usr/lib

추가 읽기

답변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는 시스템 서비스를 시작할 때 이 파일을 읽지 않습니다.

관련 정보