systemctl에 의해 시작된 프로세스의 환경 변수를 얻는 방법은 무엇입니까?

systemctl에 의해 시작된 프로세스의 환경 변수를 얻는 방법은 무엇입니까?

질문

다음과 같은 템플릿과 단위 파일이 주어지면 systemctl시작 시 프로세스에 궁극적으로 전달될 환경 변수를 가져오려고 합니다(서비스가 현재 실행 중인지 여부에 관계 없음).

/etc/systemd/system/[email protected]

...
[Service]
Environment="VAR1=val1"
Environment="VAR2=val2"
...

/etc/systemd/system/[email protected]/unit.conf

[Service]
Environment="VAR2=Overridden by %i"

제공된 옵션을 탐색한 후 출력에 변수가 단일 문자열로 포함되어 있는 것 systemctl외에는 아무것도 찾을 수 없습니다 .systemctl show example-template@example-unit --property=Environment

Environment=VAR1=val1 VAR2=Overridden by example-unit

그러나 편리한 구분 기호가 포함되어 있지 않으므로 원래 변수를 복원하기 위해 구문 분석하는 것을 피하는 것이 좋습니다.

EnvironmentFile처음에는 변수를 자체 파일로 이동하고 내 스크립트에서 가져옴으로써 해당 지시문을 활용하고 싶었습니다 . 안타깝게도 내 변수 중 하나 이상 %iEnvironmentFile.

필요한 것을 달성하는 더 좋은 방법이 있습니까?

문맥

OpenSUSE 서버에서 CentOS 7 서버로 마이그레이션된 Tomcat 인스턴스가 80개 있습니다. 역사적으로 이는 각 인스턴스에 대해 복제된 System V init 스크립트를 통해 관리되었습니다. 초기화 스크립트는 기능적으로 동일하지만 catalina.sh시작/중지 명령을 Tomcat과 함께 제공되는 스크립트에 위임하기 전에 내보내는 값이 다릅니다. 일반적인 기능을 업데이트하려면 80개 파일 모두에 변경 사항을 적용해야 합니다.

이 외에도 에 위임하고 catalina.sh, 해당 옵션을 추가하고, 배포된 파일을 제거하거나, 로그 파일을 추적하는 래퍼 스크립트가 있습니다. 이는 환경 변수에 대해 알아야 하는 스크립트입니다. 현재 환경 변수는 서버 실행 여부에 관계없이 특정 매개변수를 사용하여 init 스크립트를 호출하여 노출됩니다.

System V를 고수하고 공통 기능을 단일 소스 가능 스크립트(본래 의도)로 통합하는 대신, systemd이러한 상황을 염두에 두고 설계된 것처럼 보였기 때문에 단위 파일 템플릿에 대한 지원을 활용하기 위해 마이그레이션하기로 결정했습니다. 이를 통해 개별 인스턴스가 특정 변수를 재정의하도록 허용하면서 기본 Tomcat 설정을 전역적으로 정의할 수 있습니다(예: JVM 메모리 늘리기 또는 새 버전의 Tomcat에 대해 애플리케이션 테스트). 각 인스턴스에 고유한 환경 변수에는 PID 파일( catalina.sh주의가 필요함)과 Tomcat 기본(구성) 위치가 포함됩니다.

이를 염두에 두고 내가 직면한 문제는 위의 래퍼 스크립트가 더 이상 Tomcat 인스턴스의 환경 변수에 액세스할 수 없다는 것입니다(예: 변수 중 하나는 CATALINA_HOME배포된 애플리케이션, 로그 및 구성 파일이 포함된 경로입니다. 서버). 스크립트의 일부 기능은 서버 실행이 필요하지 않으므로(예: 중지된 서버 정리) 프로세스에서 환경을 가져오는 것이 불가능합니다.

이제 래퍼 스크립트가 유닛 이름에서 이 정보를 파생(추측)하도록 할 수도 있고, 래퍼 스크립트가 스크립트를 직접 호출하도록 하여 Tomcat 서버를 서비스로 실행하는 것을 완전히 중단할 수도 있습니다 catalina.sh. 서비스는 서비스 그 자체가 되며 systemd서비스가 실패 상태가 되면 자동으로 다시 시작하는 등 일부 기능을 활용할 수도 있습니다 .

버전 정보

  • CentOS 리눅스 버전 7.6.1810
  • 시스템 219
  • bash 4.2.46(2)-릴리스

답변1

최근에 이러한 마이그레이션을 완료했습니다.

모든 장치에 적용되는 기본값은 템플릿 파일의 Environment= 지시어에 있습니다. EnvironmentFile=production.%i.env는 인스턴스별 재정의를 로드하는 데 사용됩니다.

Production.foo.env에서는 %i를 사용할 수 없으니 걱정하지 마세요. 해당 파일에 "foo"를 하드코드하면 됩니다. 원하는 경우 이 작업을 자동화할 수 있습니다.

관련 정보