5.3. epoch, Scriptlets 및 Triggers
이 섹션에서는 RMP 사양
파일의 고급 지시문을 나타내는 Epoch
,Scriptlets
및 Triggers
에 대해 설명합니다.
이러한 모든 지시문은 사양
파일뿐만 아니라 결과 RPM이 설치된 최종 시스템에도 영향을 미칩니다.
5.3.1. Epoch 지시문
Epoch
지시문을 사용하면 버전 번호에 따라 가중치 종속 항목을 정의할 수 있습니다.
이 지시문이 RPM 사양
파일에 나열되지 않으면 Epoch
지시문이 전혀 설정되지 않습니다. 이는 Epoch
가 0인 Epoch
를 설정하지 않는다는 일반적인 신념과는 대조적입니다. 그러나 dnf
유틸리티는 해독 목적으로 0의
와 동일한 설정되지 않은 Epoch를 처리합니다.
Epoch
그러나 사양
파일에
를 나열하는 것은 대부분의 경우 패키지 버전을 비교할 때 예상되는 RPM 동작을 도입하기 때문에 일반적으로 생략됩니다.
Epoch
예 5.2. Epoch 사용
Epoch를 사용하여
및 foobar
패키지를 설치하는 경우: 1Version: 1.0
, 및 다른 사용자가 Version을 사용하여
하지만 foobar
를 패키징합니다. 2.0Epoch
지시문이 없으면 새 버전이 업데이트되지 않습니다. Epoch
버전이 RPM 패키지에 대한 버전 관리를 나타내는 기존 Name-Version-Release
마커보다 우선하기 때문입니다.
따라서 Epoch
를 사용하는 것은 매우 드물다. 그러나 Epoch
는 일반적으로 업그레이드 순서 문제를 해결하는 데 사용됩니다. 이 문제는 인코딩에 따라 항상 안정적으로 비교할 수 없는 알파벳 문자를 포함하는 소프트웨어 버전 번호 체계 또는 버전의 업스트림 변경의 측면으로 나타날 수 있습니다.
5.3.2. scriptlets 지시문
scriptlets 는 패키지 설치 또는 삭제 전이나 후에 실행되는 일련의 RPM 지시문입니다.
빌드 시 또는 시작 스크립트에서 수행할 수 없는 작업에만 Scriptlets 를 사용합니다.
공통 scriptlet 지시문 세트가 있습니다. 이는 spec
file 섹션 헤더(예: %build
또는 %install
)와 유사합니다. 이는 종종 표준 POSIX 쉘 스크립트로 작성되는 코드의 여러 줄 세그먼트에 의해 정의됩니다. 그러나 대상 시스템의 배포를 위해 RPM이 허용하는 다른 프로그래밍 언어로도 작성할 수 있습니다. RPM 문서에는 사용 가능한 언어의 전체 목록이 포함되어 있습니다.
다음 표에는 실행 순서에 나열된 Scriptlet 지시문이 포함되어 있습니다. 스크립트가 포함된 패키지가 %pre
및 %post
un 지시문 사이에 설치되고 %preun
과 %postun
지시문 사이에 제거됩니다.
directive | 정의 |
---|---|
| Scriptlet은 패키지를 설치하거나 제거하기 직전에 실행됩니다. |
| 대상 시스템에 패키지를 설치하기 직전에 실행되는 Scriptlet입니다. |
| 대상 시스템에 패키지를 설치한 후에만 실행되는 Scriptlet입니다. |
| 대상 시스템에서 패키지를 설치 제거하기 직전에 실행되는 Scriptlet입니다. |
| 대상 시스템에서 패키지를 제거한 후에 실행되는 Scriptlet입니다. |
| 트랜잭션 종료 시 실행되는 Scriptlet입니다. |
5.3.3. scriptlet 실행 비활성화
다음 절차에서는 rpm
명령을 --no_scriptlet_name_
옵션과 함께 사용하여 스크립트 파일의 실행을 끄는 방법을 설명합니다.
절차
예를 들어
%pretrans
scriptlet의 실행을 끄려면 다음을 실행합니다.# rpm --nopretrans
다음 모든 항목과 동일한
--noscripts
옵션을 사용할 수도 있습니다.-
--nopre
-
--nopost
-
--nopreun
-
--nopostun
-
--nopretrans
-
--noposttrans
-
추가 리소스
-
RPM(8)
도움말 페이지.
5.3.4. scriptlets 매크로
Scriptlets 지시문도 RPM 매크로에서 작동합니다.
다음 예제에서는 systemd에 새 장치 파일에 대해 알림을 받는 systemd scriptlet 매크로를 사용하는 방법을 보여줍니다.
$ 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
5.3.5. Triggers 지시문
Trigger 는 패키지 설치 및 제거 중에 상호 작용 방법을 제공하는 RPM 지시문입니다.
트리거 는 예기치 않은 시간에 실행될 수 있습니다(예: 포함된 패키지의 업데이트). 트리거 는 디버그하기 어렵기 때문에 예기치 않게 실행될 때 아무 것도 손상시키지 않도록 강력한 방식으로 구현해야 합니다. 이러한 이유로 Red Hat은 트리거 사용을 최소화할 것을 권장합니다.
단일 패키지 업그레이드에 대한 실행 순서와 각 기존 트리거에 대한 세부 정보는 다음과 같습니다.
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
파일에서 찾을 수 있습니다.
5.3.6. 사양 파일에서 쉘이 아닌 스크립트 사용
spec
파일의 -p
스크립트릿 옵션을 사용하면 기본 쉘 스크립트 인터프리터(-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"))
- RPM 빌드에 설명된 대로 패키지를 빌드합니다.
패키지를 설치합니다.
# dnf 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 스크립트를 사용하려면 spec
파일에 install -m
아래에 다음 행을 포함합니다.
%post -p /usr/bin/python3
Lua 스크립트를 사용하려면 SPEC 파일에 install -m
아래에 다음 행을 추가하십시오.
%post -p <lua>
이렇게 하면 사양
파일에서 인터프리터를 지정할 수 있습니다.