systemd: 환경 변수의 기본값

systemd: 환경 변수의 기본값

일부 OpenRC 초기화 스크립트를 systemd로 마이그레이션하고 싶지만 이것이 systemd의 환경 변수 처리에 대한 일반적인 문제라고 생각합니다.

원본 OpenRC 파일

/etc/conf.d/fooservice예를 들어 콘텐츠가 포함된 파일이 있습니다.

# FOO 변수의 값
# 이 줄의 주석 처리를 제거하여 기본값을 무시할 수 있습니다
# FOO=값1

# BAR 변수의 값
바=값2

원래 시작 스크립트에는 다음 /etc/init.d/fooservice이 있습니다.

FOO=${FOO:-default_foo_value}
바=${BAR:-default_bar_value}

그래서 결과 $FOO==default_foo_value$BAR==value2

마이그레이션된 시스템 파일

/usr/lib/systemd/system/fooservice.service이제 다음을 포함하는 systemd 서비스 파일이 있습니다.

[제공하다]
환경 파일 =/etc/conf.d/fooservice
ExecStart=/usr/bin/fooservice $FOO $BAR

$FOO그런데 초기화가 안되는 문제가 있습니다default_foo_value

환경 파일에 값이 없으면 systemd에 기본값을 사용하도록 지시하는 방법이 있습니까? 기본값이 있는 중간 환경 파일이나 여러 링크된 환경 파일을 사용할 수 있는 방법이 있나요?

해결책:

이는 좋은 생각이 아닙니다. /etc/conf.d/fooservice파일은 "쉘 스크립트"이고 systemd에는 "환경 파일"이 필요하기 때문에 호환되지 않을 수 있습니다. 기본 할당에서는 유사해 보이지만 동일한 것은 아닙니다.

이에 대해 Gentoo가 선호하는 솔루션은 다른 파일을 사용하는 대신 모든 것을 서비스 파일과 서비스 구성 파일에 넣는 것입니다 conf.d.

유효하지만 선호되지 않는 솔루션:

OpenRC 서비스를 systemd만큼 빠르게 실행하려면 이 방법을 사용하세요.

/usr/lib/systemd/system/fooservice.service이제 포함

[제공하다]
환경="FOO=default_foo_value"
환경="BAR=default_bar_value"
환경 파일 =/etc/conf.d/fooservice
ExecStart=/usr/bin/fooservice $FOO $BAR

답변1

systemd는 쉘이 아니므로 환경 파일에서 쉘별 대체를 지원하지 않습니다. 형식은 간단 KEY=VALUE하며 빈 줄과 주석이 포함될 수 있습니다.

견적으로 이동시스템 실행(5):

이러한 파일의 설정은 Environment=를 사용하여 만든 설정보다 우선합니다. 이러한 파일에서 동일한 변수가 두 번 설정되면 지정된 순서대로 파일이 읽혀지고 나중 설정이 이전 설정을 덮어씁니다.

따라서 다음 방법 중 하나로 작업을 완료할 수 있습니다.

  • 여러 EnvironmentFile=지시어 사용(정규 순서에 따라 서로 재정의됨)

  • Environment=서비스 파일에서 기본값을 지정하는 데 사용합니다(모든 값이 EnvironmentFile=이를 재정의함).

관련 정보