6.3. ファイルトリガーのサポート
File triggers
は RPM スクリプトレット の一種です。
これらはパッケージの SPEC ファイルで定義されます。
Triggers と同様、これらはあるパッケージで宣言されますが、一致するファイルを含む別のパッケージをインストールまたは削除したときに実行されます。
ファイルトリガー
の一般的な用途は、レジストリーまたはキャッシュを更新することです。このようなユースケースでは、レジストリーまたはキャッシュを含む、または管理するパッケージにも、単一または複数の ファイルトリガー
が含まれている必要があります。ファイルトリガー
を含めると、パッケージがそれ自体の更新を制御する場合と比べて時間を短縮できます。
6.3.1. ファイルトリガー構文
ファイルトリガー
の構文は以下のとおりです。
%file_trigger_tag [FILE_TRIGGER_OPTIONS] — PATHPREFIX… body_of_script
詳細は以下のようになります。
file_trigger_tag
は、ファイルトリガーのタイプを定義します。使用可能なタイプは次のとおりです。
-
filetriggerin
-
filetriggerun
-
filetriggerpostun
-
transfiletriggerin
-
transfiletriggerun
-
transfiletriggerpostun
FILE_TRIGGER_OPTIONS
は、-P
オプションを除き、RPM スクリプトレットオプションと同じ目的で使用されます。
トリガーの優先度は数字で定義されます。この数字が大きいほど、ファイルトリガースクリプトの実行優先度が高くなります。優先度が 100000 を超えるトリガーは、標準のスクリプトレットの前に実行され、その他のトリガーは標準のスクリプトレットの後に実行されます。デフォルトの優先度は 1000000 に設定されています。
各タイプのすべてのファイルトリガーには、1 つ以上のパス接頭辞とスクリプトが含まれている必要があります。
6.3.2. ファイルトリガー構文の例
次の例は、File triggers
の構文を示しています。
%filetriggerin — /lib, /lib64, /usr/lib, /usr/lib64 /usr/sbin/ldconfig
このファイルトリガーは、/usr/lib
または /lib
で始まるパスを含むパッケージのインストール後に、/usr/bin/ldconfig
を直接実行します。/usr/lib
または /lib
で始まるパスを持つ複数のファイルがパッケージに含まれている場合でも、ファイルトリガーは 1 度のみ実行されます。ただし、/usr/lib
または /lib
で始まるファイル名はすべて、以下のようにスクリプト内でフィルタリングできるように、トリガースクリプトの標準入力に渡されます。
%filetriggerin — /lib, /lib64, /usr/lib, /usr/lib64 grep "foo" && /usr/sbin/ldconfig
このファイルトリガーは、/usr/lib
で始まり、foo
を同時に含むファイルがある各パッケージに対して /usr/bin/ldconfig
を実行します。接頭辞に一致するファイルには、通常のファイル、ディレクトリー、シンボリックリンクなど、すべての種類のファイルが含まれることに注意してください。
6.3.3. ファイルトリガータイプ
ファイルトリガー
には、以下の 2 つの主要タイプがあります。
ファイルトリガー
は、以下のように、実行時間に基づいてさらに分割されます。
- パッケージのインストールまたは消去の前または後
- トランザクションの前または後
6.3.3.1. パッケージファイルトリガーごとの実行
パッケージごとに 1 回実行される ファイルトリガー
:
- %filetriggerin
- %filetriggerun
- %filetriggerpostun
%filetriggerin
このファイルトリガーは、このトリガーの接頭辞に一致するファイルが 1 つ以上パッケージに含まれている場合にパッケージのインストール後に実行されます。また、これはこのファイルトリガーを含むパッケージのインストール後に実行されます。rpmdb
データベースにこのファイルトリガーの接頭辞に一致するファイルが 1 つ以上存在します。
%filetriggerun
このトリガーの接頭辞に一致するファイルが 1 つ以上このパッケージに含まれている場合、このファイルトリガーはパッケージのアンインストールの前に実行されます。また、これはこのファイルトリガーを含むパッケージをアンインストールする前に実行されます。rpmdb
には、このファイルトリガーの接頭辞に一致するファイルが 1 つ以上あります。
%filetriggerpostun
このファイルトリガーは、このトリガーの接頭辞に一致するファイルが 1 つ以上含まれている場合に、パッケージのアンインストール後に実行されます。
6.3.3.2. トランザクションファイルトリガーごとに 1 の回実行
トランザクションごとに 1 回実行される ファイルトリガー
:
- %transfiletriggerin
- %transfiletriggerun
- %transfiletriggerpostun
%transfiletriggerin
このファイルトリガーはトランザクション後に、このトリガーの接頭辞に一致する 1 つ以上のファイルを含むすべてのインストール済みパッケージに対して実行されます。このトランザクションにこのファイルトリガーを含むパッケージがあり、rpmdb
にこのトリガーの接頭辞に一致するファイルがつ以上ある場合は、トランザクションの後にも実行されます。
%transfiletriggerun
このファイルトリガーは、以下の条件を満たすすべてのパッケージのトランザクションの前に 1 度だけ実行されます。
- このトランザクションでパッケージがアンインストールされます。
- パッケージには、このトリガーの接頭辞に一致する 1 つ以上のファイルが含まれています。
このトランザクションにこのファイルトリガーを含むパッケージがあり、rpmdb
にこのトリガーの接頭辞に一致するファイルが 1 つ以上ある場合は、トランザクションの前にも実行されます。
%transfiletriggerpostun
このファイルトリガーは、トランザクション後に、このトリガーの接頭辞に一致する 1 つ以上のファイルを含むすべてのアンインストール済みパッケージに対して実行されます。
このトリガータイプでは、トリガーファイルのリストは利用できません。
そのため、ライブラリーを含む複数のパッケージをインストールまたはアンインストールすると、トランザクション全体の最後で ldconfig キャッシュが更新されます。これにより、キャッシュが各パッケージに対して個別に更新されていた RHEL 7 に比べて、パフォーマンスが大幅に改善されます。また、すべてのパッケージの SPEC ファイルで ldconfig と %postun を呼び出していたスクリプレットが必要ではなくなりました。
6.3.4. glibc でのファイルトリガーの使用例
次の例は、glibc
パッケージ内での File triggers
の実際の使用法を示しています。
RHEL 8 では、インストールまたはアンインストールトランザクションの最後に ldconfig
コマンドを呼び出すために、ファイルトリガー
が glibc
に実装されています。
これは、glibc
SPEC ファイルに以下のスクリプトレットを含めることで実現されました。
%transfiletriggerin common -P 2000000 – /lib /usr/lib /lib64 /usr/lib64 /sbin/ldconfig %end %transfiletriggerpostun common -P 2000000 – /lib /usr/lib /lib64 /usr/lib64 /sbin/ldconfig %end
そのため、複数のパッケージのインストールまたはアンインストールを行うと、トランザクション全体が終了してから、インストールしたすべてのライブラリーに対して ldconfig
キャッシュが更新されます。そのため、個別のパッケージの RPM SPEC ファイルに ldconfig を呼び出すスクリプトレットを含める必要はありません。これにより、RHEL 7 に比べてパフォーマンスが改善され、各パッケージに対してキャッシュが別途更新されるようになりました。