このケーススタディーでは、パッケージのインストール中に crontab ファイルを変更します。
このケーススタディーでは、次の手法の実例を示します。
クラスおよびクラスアクションスクリプトを使用する
詳細については、「クラスアクションスクリプトの書き込み」を参照してください。
クラスアクションスクリプト内で crontab コマンドを使用する。
インストール中に複数のファイルを編集する最も効率的な方法は、クラスを定義し、クラスアクションスクリプトを作成することです。build クラスによるアプローチを使用した場合は、編集する crontab ファイルごとに 1 つの build クラススクリプトを作成する必要があります。cron クラスを定義する方法は、より汎用性のあるアプローチとなります。このアプローチで crontab ファイルを編集するには、次の作業を行う必要があります。
prototype ファイルで、編集対象の crontab ファイルを定義します。
prototype ファイルで、編集対象の crontab ファイルごとにエントリを作成します。クラスを cron として定義し、ファイルタイプをファイルごとに e として定義します。編集対象とするファイルの実際の名前を使用してください。
パッケージ用の crontab ファイルを作成します。
これらのファイルには、同じ名前の既存の crontab ファイルに追加する情報を格納します。
cron クラス用のインストールクラスアクションスクリプトを作成します。
サンプルの i.cron スクリプトは、次の手順を実行します。
ユーザー ID (UID) を決定する。
i.cron スクリプトは、変数 user を、処理対象の cron クラススクリプトのベース名に設定します。この名前が UID です。たとえば、/var/spool/cron/crontabs/root のベース名は root で、これが UID でもあります。
UID と -l オプションを使用して、crontab を実行します。
-l オプションは、定義されたユーザーの crontab ファイルの内容を標準出力に送信するように、crontab に指示します。
crontab コマンドの出力を、このインストール手法で以前に追加されたすべてのエントリを削除する sed スクリプトにパイプで連結します。
編集された出力を一時ファイルに置きます。
ルート UID のデータファイル (パッケージとともに提供されたもの) を一時ファイルに追加し、これらのエントリの出自を示すタグを追加します。
同じ UID の crontab を実行し、一時ファイルを入力として指定します。
cron クラス用の削除クラスアクションスクリプトを作成します。
r.cron スクリプトは、crontab ファイルに情報を追加する手順がない点を除き、インストールスクリプトと同じです。
これらの手順は、cron クラスのすべてのファイルに対して実行されます。
次に示す i.cron および r.cron スクリプトは、スーパーユーザーによって実行されます。ほかのユーザーの crontab ファイルをスーパーユーザーとして編集すると、予期しない結果が生じる可能性があります。必要な場合は、各スクリプトで次に示すエントリを変更してください。
crontab $user < /tmp/$$crontab ||
から
su $user -c "crontab /tmp/$$crontab" ||
PKG=case7 NAME=Case Study #7 CATEGORY=application BASEDIR=/opt ARCH=SPARC VERSION=Version 1.0 CLASSES=cron |
i pkginfo i i.cron i r.cron e cron /var/spool/cron/crontabs/root ? ? ? e cron /var/spool/cron/crontabs/sys ? ? ? |
# PKGINST parameter provided by installation service while read src dest do user=`basename $dest` || exit 2 (crontab -l $user | sed -e "/#$PKGINST$/d" > /tmp/$$crontab) || exit 2 sed -e "s/$/#$PKGINST/" $src >> /tmp/$$crontab || exit 2 crontab $user < /tmp/$$crontab || exit 2 rm -f /tmp/$$crontab done exit 0 |
# PKGINST parameter provided by installation service while read path do user=`basename $path` || exit 2 (crontab -l $user | sed -e "/#$PKGINST$/d" > /tmp/$$crontab) || exit 2 crontab $user < /tmp/$$crontab || exit 2 rm -f /tmp/$$crontab done exit |
41,1,21 * * * * /usr/lib/uucp/uudemon.hour > /dev/null 45 23 * * * ulimit 5000; /usr/bin/su uucp -c "/usr/lib/uucp/uudemon.cleanup" > /dev/null 2>&1 11,31,51 * * * * /usr/lib/uucp/uudemon.poll > /dev/null |
0 * * * 0-6 /usr/lib/sa/sa1 20,40 8-17 * * 1-5 /usr/lib/sa/sa1 5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A |
複数のファイルを編集することにより、ファイルの合計サイズが 10K を超えて増加する場合は、pkgadd コマンドがこの増加に対応できるように、space ファイルを作成してください。space ファイルについては、「ターゲットシステムでの追加領域の予約」を参照してください。