이는 $(ls -d...)
시스템 단위 파일에서는 작동하지 않습니다.
[Service]
Type=forking
Environment="ORACLE_HOME=$(ls -d /usr/lib/oracle/*/client64 | sort -rV | head -n1)"
Environment="TNS_ADMIN=$(ls -d /usr/lib/oracle/*/client64/lib/network/admin | sort -rV | head -n1)"
업데이트를 단순화하기 위해 Oracle 클라이언트 버전(현재 19.19)을 하드코딩하는 것을 피하고 싶습니다. 새 Oracle 클라이언트를 설치할 때 시스템 단위 파일을 수정하고 싶지 않습니다.
어떻게 해야 하나요? 중요한 경우 RHEL9를 사용하고 있습니다.
답변1
가장 일반적인 방법:
사용
EnvironmentFile=
예를 들어 ExecStartPre=를 통해 간단한 스크립트를 호출하여 동적으로 생성됩니다. 현재 시스템 버전은 각 실행 전에 EnvironmentFile을 다시 읽어서 작동하도록 합니다. (/run은 임시 파일을 저장하기에 좋은 장소입니다.)스크립트는 이러한 행만 작성하면 되므로 이는 가장 간단한 방법입니다
KEY="value"
.시스템을 사용하세요발전기구성이 (다시)로드될 때마다 /run/systemd에 단위 파일을 동적으로 작성합니다. 생성기는 로컬 파일 시스템 액세스로 제한되는 한 쉘 스크립트일 수 있습니다.
생성기는
/etc/systemd/system-generators/
부팅할 때마다 그리고 "systemctl daemon-reload"마다 실행되어 출력 경로가 가 되도록 할 수 있습니다$1
. 생성기는 실제로 장치가 시작되기 전에 실행되므로 네트워크나 다른 어떤 것도 시작될 것으로 기대할 수 없습니다. 위로.이는 환경뿐 아니라 WorkingDirectory=와 같은 다른 요소까지 모든 단위 옵션을 동적으로 지정할 수 있으므로 가장 유연한 접근 방식입니다. (생성기는 생성할 필요가 없습니다.모두유닛; 생성하거나 유사한 방식으로 기존 유닛을 확장할 수 있습니다
$1/oracle.service.d/environ.conf
. )
다른 방법:
인스턴스화된 서비스 단위 사용
[email protected]
%i
버전을 채우는 데 사용됩니다 . 여전히 "oracle@old"를 비활성화하고 "oracle@new"를 활성화해야 하지만 이렇게 하면 텍스트 편집기를 여는 시간이 절약됩니다. (또한 올바른 장치를 시작하여 이전 버전으로 빠르게 롤백하는 것도 쉽습니다.)생각하다Alias=oracle.service
인스턴스를 활성화하면 자동으로 더 짧은 이름에 매핑되도록 하나 가질 수 있습니다 .래퍼 쉘 스크립트를 사용하여 변수를 설정하고
exec
실제 프로그램을 저장합니다. 예, 이것은exec
중요합니다. (또한 SyslogIdentifier=를 사용하면 스크립트 이름이 Journalctl 출력에 표시되는 것을 방지할 수 있습니다.) 래퍼 스크립트는 일반적으로 권장되지 않지만 이는 대개 .service로 쉽게 수행할 수 있는 작업을 수행하기 때문이지만 100% 그런 것은 아닙니다. 여기.
systemctl set-environment
전역이므로 피하세요 . 변수를 사용할 수 있습니다.모두원하든 원하지 않든 그 시점부터 서비스가 시작됩니다.