この章では、アカウンティングを設定し、管理する手順について説明します。
この章で説明する手順は次のとおりです。
システムアカウンティングは、システムがマルチユーザーモード (システム状態 2) のときに実行されるように設定できます。システムアカウンティングには、次の内容が含まれます。
/etc/rc0.d/K22acct および /etc/rc2.d/S22acct ファイルの作成
/var/spool/cron/crontabs/adm および /var/spool/cron/crontabs/root ファイルの変更
アカウント用スクリプトのほとんどは、/var/spool/cron/crontabs/adm データベースファイルに追加されます。表 31-1 に、デフォルトのアカウンティング管理スクリプトを説明します。
表 31-1 デフォルトのアカウンティング管理スクリプト
アカウンティングスクリプト |
目的 |
実行方法 |
---|---|---|
ckpacct(1M) |
/usr/adm/pacct ログファイルのサイズをチェックする |
定期的 |
runacct(1M) |
接続、ディスク、および料金のアカウンティング情報を処理する |
日次 |
monacct(1M) |
会計レポートを生成する。定期的に実行される |
会計期間に基づく |
これらのデフォルトは変更できます。上記エントリをデータベースに追加して、アカウンティングプログラムをインストールした後、アカウンティングは自動的に実行されるようになります。
スーパーユーザーになります。
必要な場合は、pkgadd コマンドを使用して、システムに SUNWaccr と SUNWaccu パッケージをインストールします。
次のように入力して、/etc/init.d/acct を実行レベル 2 の起動スクリプトとしてインストールします。
# ln /etc/init.d/acct /etc/rc2.d/S22acct |
/etc/init.d/acct を実行レベル 0 の停止スクリプトとしてインストールします。
# ln /etc/init.d/acct /etc/rc2.d/S22acct |
プログラム ckpacct、runacct、および monacct が自動的に起動するように、adm ユーザーの crontab ファイルに次の行を追加します。
# EDITOR=vi; export EDITOR # crontab -e adm 0 * * * * /usr/lib/acct/ckpacct 30 2 * * * /usr/lib/acct/runacct 2> /var/adm/acct/nite/fd2log 30 7 1 * * /usr/lib/acct/monacct |
プログラム dodisk が自動的に起動するように、root の crontab ファイルに次の行を追加します。
# crontab -e 30 22 * * 4 /usr/lib/acct/dodisk |
システムをリブートするか、次のように入力します。
# /etc/init.d/acct start |
次の例は、/usr/lib/acct/ckpacct、/usr/lib/acct/runacct、および /usr/lib/acct/monacct を実行する crontab エントリを /var/spool/cron/crontabs/adm に追加する方法を示します。
#ident "@(#)adm 1.5 92/07/14 SMI" /* SVr4.0 1.2 */ # # The adm crontab file should contain startup of performance # collection if the profiling and performance feature has been # installed. 0 * * * * /usr/lib/acct/ckpacct 30 2 * * * /usr/lib/acct/runacct 2> /var/adm/acct/nite/fd2log 30 7 1 * * /usr/lib/acct/monacct |
次の例は、/usr/lib/acct/dodisk を実行する crontab エントリを /var/spool/cron/crontabs/root に追加する方法を示します。
#ident "@(#)root 1.16 98/04/28 SMI" /* SVr4.0 1.1.3.1 */ # # The root crontab should be used to perform accounting data collection. # # The rtc command is run to adjust the real time clock if and when # daylight savings time changes. # 10 3 * * 0,4 /etc/cron.d/logchecker 10 3 * * 0 /usr/lib/newsyslog 15 3 * * 0 /usr/lib/fs/nfs/nfsfind 1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1 30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean 30 22 * * 4 /usr/lib/acct/dodisk |
次に /etc/acct/holidays ファイルの例を示します。
* @(#)holidays January 1, 1999 * * Prime/Nonprime Table for UNIX Accounting System * * Curr Prime Non-Prime * Year Start Start * 1999 0800 1800 * * only the first column (month/day) is significant. * * month/day Company * Holiday * 1/1 New Years Day 7/4 Indep. Day 12/25 Christmas |
ファイルの復元、リモート印刷などの特別なユーザーサービスを要求時に提供する場合は、chargefee(1M) という機能を使用してユーザーに対する課金処理を行うことができます。chargefee は、課金をファイル /var/adm/fee に記録します。次に、runacct ユーティリティが実行されるたびに、新しいエントリが拾い出されて、全体のアカウンティングレコードにマージされます。
ユーザーに提供されたサービスに対して課金するように設定します。
# chargefee username amount |
username |
課金したいユーザーアカウント |
amount |
ユーザーに対する課金の単位数 |
次の例は、ユーザーがアカウント print_customer にログインするたびに 10 単位を課金します。
# chargefee print_customer 10 |
この節では、アカウンティング情報を保守する方法について説明します。
UNIX のアカウンティングシステムは堅固ではなく、ファイルが壊れたり失われることがあります。そのようなファイルにも、単に無視してよいものや、バックアップから復元できるものがあります。しかし、特定のファイルは、アカウンティングシステムの完全性を維持するために修復しなければなりません。
wtmpx(4) ファイルは、アカウンティングシステムを日常的に運用する上で発生する大部分の問題の原因になっています。日付が変更され、システムがマルチユーザーモードになると、1 組の日付変更レコードが /var/adm/wtmp に書き込まれます。wtmpfix(1M) ユーティリティは、日付変更されたときの wtmpx レコード内のタイムスタンプの調整用として用意されています。ただし、日付変更とリブートとの組み合わせによっては、wtmpfix のチェックから漏れて、acctcon の処理を失敗させることがあります。wtmpx の問題を解決する手順については、「wtmpx ファイルを修復する方法」を参照してください。
スーパーユーザーになります
ディレクトリ /var/adm/acct/nite に変更します。
次のように、バイナリファイル wtmp.MMDD を ASCII ファイル xwtmp に変換します。
# fwtmp wtmp.MMDD xwtmp |
MMDD |
2 桁の数値で指定される月日 |
xwtmp を編集します。壊れたファイルを削除するか、始めから日付変更までのすべてのレコードを削除します。
ASCII ファイル xwtmp をバイナリファイルに変換し、壊れたファイルを上書きします。
# fwtmp -ic xwtmp wtmp.MMDD |
/var/adm/acct/sum/tacct の完全性は、システム資源に対してユーザーに課金している場合は重要です。負の番号、重複したユーザー ID、または 65535 のユーザー ID など、不可思議な tacct レコードが現れることがありますが、その場合は prtacct で /var/adm/acct/sum/tacctprev を印刷して、チェックしてください。内容が正しい場合は、最新の /var/adm/acct/sum/tacct.MMDD ファイルを使用して、/var/adm/acct/sum/tacct ファイルを作成し直してください。次の手順は、簡単な修復手順の概要を説明しています。
スーパーユーザーになります。
ディレクトリ /var/adm/acct/sum に変更します。
次のように、tacct.MMDD の内容をバイナリから ASCII 形式に変換します。
# acctmerg -v tacct.MMDD xtacct |
MMDD |
2 桁の数字で指定される月日 |
xtacct ファイルを ASCII 形式からバイナリに変換します。
# acctmerg -i xtacct tacct.MMDD |
MMDD |
2 桁の数字で指定される月日 |
ファイル tacct.prv と tacct.MMDD をマージしてファイル tacct を生成します。
# acctmerg tacctprev tacct.MMDD tacct |
runacct プログラムはいろいろな原因で失敗することがあります。一番多い原因は、システムがクラッシュする、/var がディスク容量を使い果たす、wtmpx ファイルが壊れたなどです。active.MMDD ファイルが存在する場合、まずエラーメッセージがないか調べます。active ファイルとロックファイルが存在する場合、異常なメッセージがないかどうか fd2log ファイルを調べます。
runacct は、引数を指定しないで実行すると、その日の最初の起動とみなします。runacct を起動し直し、もう一度 runacct にアカウンティングをやり直させる月日を指定する場合は、引数 MMDD が必要です。処理のエントリポイントは statefile の内容に基づきます。statefile を無効にするには、次のように処理を開始したい状態をコマンド行に指定します。
runacct プログラムを手動で実行するときは、ユーザー adm として実行していることを確認してください。
lastdate ファイルと lock* ファイル (もしあれば) を削除します。
$ cd /var/adm/acct/nite $ rm lastdate lock* |
runacct プログラムを再起動します。
$ runacct MMDD [state] 2> /var/adm/acct/nite/fd2log & |
MMDD |
月日を数値で指定する |
state |
システムアカウンティングは、一時的に停止することも、永久に無効にすることもできます。
スーパーユーザーになります。
適切な行をコメントアウトすることによって、プログラム ckpacct、runacct、および monacct の実行が停止するように、ユーザー adm の crontab ファイルを変更します。
# EDITOR=vi; export EDITOR # crontab -e adm #0 * * * * /usr/lib/acct/ckpacct #30 2 * * * /usr/lib/acct/runacct 2> /var/adm/acct/nite/fd2log #30 7 1 * * /usr/lib/acct/monacct |
適切な行をコメントアウトすることによって、プログラム dodisk の実行が停止するように、ユーザー root の crontab ファイルを変更します。
# crontab -e #30 22 * * 4 /usr/lib/acct/dodisk |
次のように入力して、アカウンティングプログラムを停止します。
# /etc/init.d/acct stop |
システムアカウンティングプログラムを再び有効にするには、新たに追加したコメント記号を crontab ファイルから削除して、次のように入力します。
# /etc/init.d/acct start |
スーパーユーザーになります。
ユーザー adm の crontab ファイルを編集して、プログラム ckpacct、runacct、および monacct 用のエントリを削除します。
# EDITOR=vi; export EDITOR # crontab -e adm |
ユーザー root の crontab ファイルを変更して、プログラム dodisk 用のエントリを削除します。
# crontab -e |
実行レベル 2 用の起動スクリプトのリンクを取り外します。
# unlink /etc/rc2.d/S22acct |
実行レベル 0 用の停止スクリプトのリンクを取り外します。
# unlink /etc/rc0.d/K22acct |
次のように入力して、アカウンティングプログラムを停止します。
# /etc/init.d/acct stop |