일부 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=
이를 재정의함).