4.3. epoch, Scriptlets 및 Triggers
이 섹션에서는 RMP SPEC 파일의 고급 지시문을 나타내는 Epoch
,Scriptlets
, 및 Trigger
에 대해 설명합니다.
이러한 모든 지시문은 SPEC 파일뿐만 아니라 결과 RPM이 설치된 최종 시스템에도 영향을 미칩니다.
4.3.1. Epoch 지시문
Epoch
지시문을 사용하면 버전 번호에 따라 가중치가 지정된 종속성을 정의할 수 있습니다.
RPM SPEC 파일에 이 지시문이 나열되지 않으면 Epoch
지시문이 전혀 설정되지 않습니다. 이는 Epoch
를 0으로 설정하지 않는 일반적인 추측
입니다. 그러나 YUM 유틸리티는 해독 목적으로 설정되지 않은 Epoch
를 0의 Epoch
와 동일하게 처리합니다.
그러나 대부분의 경우 Epoch
값이 패키지 버전을 비교할 때 예상되는 RPM 동작을 도입하기 때문에 SPEC 파일에 Epoch
를 나열하는 것은 일반적으로 생략됩니다.
예 4.2. Epoch 사용
Epoch: 1
및 버전: 1.0
과 함께 foobar
패키지를 설치하고 다른 사람이 버전: 2.0
을 사용하여 foobar
패키지인 경우 Epoch
지시문이 없는 경우 새 버전은 업데이트로 간주되지 않습니다. Epoch
버전이 RPM 패키지에 대한 버전 관리를 나타내는 기존 Name-Version-Release
마커보다 우선하기 때문입니다.
따라서 Epoch
를 사용하는 것은 매우 드문 경우입니다. 그러나 일반적으로 Epoch
는 업그레이드 순서 문제를 해결하는 데 사용됩니다. 이 문제는 인코딩을 기반으로 항상 안정적으로 비교할 수 없는 알파벳순 문자를 포함하는 소프트웨어 버전 번호 체계 또는 버전을 포함하는 업스트림 변경의 부작용을 나타낼 수 있습니다.
4.3.2. scriptlets
scriptlets 는 패키지 설치 또는 삭제 전이나 후에 실행되는 일련의 RPM 지시문입니다.
Scriptlets 는 빌드 시 또는 시작 스크립트에서는 수행할 수 없는 작업에만 사용합니다.
4.3.2.1. scriptlets 지시문
일반적인 Scriptlet 지시문 세트가 있습니다. SPEC 파일 섹션 헤더(예: %build
또는 %install
)와 유사합니다. 이는 여러 줄 코드 세그먼트에 의해 정의되며 종종 표준 POSIX 쉘 스크립트로 작성됩니다. 그러나 대상 머신의 배포에 대한 RPM이 허용하는 다른 프로그래밍 언어로도 작성할 수 있습니다. RPM 설명서에는 사용 가능한 언어의 전체 목록이 포함되어 있습니다.
다음 표에는 실행 순서에 나열된 Scriptlet 지시문이 포함되어 있습니다. 스크립트가 포함된 패키지는 %pre
및 %post
지시문 간에 설치되며 %preun
과 %postun
지시문 간에 제거됩니다.
directive | 정의 |
---|---|
| 패키지를 설치하거나 제거하기 직전에 실행되는 Scriptlet입니다. |
| 대상 시스템에 패키지를 설치하기 직전에 실행되는 Scriptlet입니다. |
| 대상 시스템에 패키지가 설치된 직후에 실행되는 Scriptlet입니다. |
| 대상 시스템에서 패키지를 제거하기 직전에 실행되는 Scriptlet입니다. |
| 대상 시스템에서 패키지가 제거된 직후에 실행되는 Scriptlet입니다. |
| 트랜잭션 마지막에 실행되는 Scriptlet입니다. |
4.3.2.2. scriptlet 실행 끄기
스크립트릿 실행을 끄려면 rpm
명령을 --no_scriptlet_name_
옵션과 함께 사용합니다.
절차
예를 들어
%pretrans
스크립트릿의 실행을 끄려면 다음을 실행합니다.# rpm --nopretrans
다음과 같은
--noscripts
옵션을 사용할 수도 있습니다.-
--nopre
-
--nopost
-
--nopreun
-
--nopostun
-
--nopretrans
-
--noposttrans
-
추가 리소스
-
자세한 내용은
rpm(8)
매뉴얼 페이지를 참조하십시오.
4.3.2.3. scriptlets 매크로
Scriptlets 지시문도 RPM 매크로에서 작동합니다.
다음 예제에서는 systemd scriptlet 매크로를 사용하여 새 장치 파일에 대해 systemd에 대한 알림을 받는 방법을 보여줍니다.
$ rpm --showrc | grep systemd -14: transaction_systemd_inhibit %{plugindir}/systemd_inhibit.so -14: _journalcatalogdir /usr/lib/systemd/catalog -14: _presetdir /usr/lib/systemd/system-preset -14: _unitdir /usr/lib/systemd/system -14: _userunitdir /usr/lib/systemd/user /usr/lib/systemd/systemd-binfmt %{?} >/dev/null 2>&1 || : /usr/lib/systemd/systemd-sysctl %{?} >/dev/null 2>&1 || : -14: systemd_post -14: systemd_postun -14: systemd_postun_with_restart -14: systemd_preun -14: systemd_requires Requires(post): systemd Requires(preun): systemd Requires(postun): systemd -14: systemd_user_post %systemd_post --user --global %{?} -14: systemd_user_postun %{nil} -14: systemd_user_postun_with_restart %{nil} -14: systemd_user_preun systemd-sysusers %{?} >/dev/null 2>&1 || : echo %{?} | systemd-sysusers - >/dev/null 2>&1 || : systemd-tmpfiles --create %{?} >/dev/null 2>&1 || : $ rpm --eval %{systemd_post} if [ $1 -eq 1 ] ; then # Initial installation systemctl preset >/dev/null 2>&1 || : fi $ rpm --eval %{systemd_postun} systemctl daemon-reload >/dev/null 2>&1 || : $ rpm --eval %{systemd_preun} if [ $1 -eq 0 ] ; then # Package removal, not upgrade systemctl --no-reload disable > /dev/null 2>&1 || : systemctl stop > /dev/null 2>&1 || : fi
4.3.3. Triggers 지시문
트리거 는 패키지 설치 및 제거 중 상호 작용을 위한 방법을 제공하는 RPM 지시문입니다.
트리거 는 예기치 않은 시간에 실행될 수 있습니다(예: 포함 패키지의 업데이트). 트리거 는 디버그하기 어렵기 때문에 예기치 않게 실행될 때 아무것도 중단하지 않도록 강력한 방식으로 구현해야 합니다. 이러한 이유로 {RH}는 트리거 사용을 최소화할 것을 권장합니다.
실행 순서 및 각 기존 Trigger 의 세부 정보는 다음과 같습니다.
all-%pretrans … any-%triggerprein (%triggerprein from other packages set off by new install) new-%triggerprein new-%pre for new version of package being installed … (all new files are installed) new-%post for new version of package being installed any-%triggerin (%triggerin from other packages set off by new install) new-%triggerin old-%triggerun any-%triggerun (%triggerun from other packages set off by old uninstall) old-%preun for old version of package being removed … (all old files are removed) old-%postun for old version of package being removed old-%triggerpostun any-%triggerpostun (%triggerpostun from other packages set off by old un install) … all-%posttrans
위의 항목은 /usr/share/doc/rpm-4.*/triggers
파일에 있습니다.
4.3.4. SPEC 파일에서 쉘 이외의 스크립트 사용
SPEC 파일의 -p
scriptlet 옵션을 사용하면 사용자가 기본 쉘 스크립트 인터프리터(-p /bin/sh
) 대신 특정 인터프리터를 호출할 수 있습니다.
다음 절차에서는 pello.py
프로그램을 설치한 후 메시지를 출력하는 스크립트를 생성하는 방법을 설명합니다.
절차
-
pello.spec
파일을 엽니다. 다음 행을 찾습니다.
install -m 0644 %{name}.py* %{buildroot}/usr/lib/%{name}/
위의 줄에서 다음을 삽입합니다.
%post -p /usr/bin/python3 print("This is {} code".format("python"))
패키지를 설치합니다.
# yum install /home/<username>/rpmbuild/RPMS/noarch/pello-0.1.2-1.el8.noarch.rpm
설치 후 출력 메시지를 확인합니다.
Installing : pello-0.1.2-1.el8.noarch 1/1 Running scriptlet: pello-0.1.2-1.el8.noarch 1/1 This is python code
Python 3 스크립트를 사용하려면 install -m
아래에 SPEC 파일에 다음 행을 포함합니다.
%post -p /usr/bin/python3
Lua 스크립트를 사용하려면 install -m
아래에 SPEC 파일에 다음 행을 포함합니다.
%post -p <lua>
이렇게 하면 SPEC 파일에서 모든 인터프리터를 지정할 수 있습니다.