                日々の運用についてのTIPS

------------------------------------------------------------
1	TIPS
1.1	自動的に記事のスプールを圧縮する
1.2	自動的にスプールの古い記事を消す
1.3	ログをみる
1.4	fml のログのチェックをする

2	examples
2.1	アーカイブが作られる場所
2.2	アーカイブの単位
2.3	get コマンドとサーチパス
2.4	Expire 時に Summary ファイルも作り直す

3	アーカイブ, archive
3.1	Introduction
3.2	自動アーカイブと自動 expire の諸注意
3.3	何故、まとめてgzip化したいのか?

4	utility プログラム
4.1	gzip file にする(アーカイブへの変換)
4.2	アーカイブ作成を cron で自動処理

5	Expire (一定日数より古いファイルは消す)とNewSyslog
5.1	Introduction
5.2	自動アーカイブと自動 expire 
5.3	Config.ph Configurations
5.4	expire.pl コマンドラインオプション (bin/expire.pl)

6	その他のTIPS
6.1	cronでnewsyslogをする (OBSOLETE shell version)
6.2	actives/members ファイルのバックアップ: .bak => .0 =>.1 
6.3	ログファイル($DIR/log)の turn over
6.4	newsyslog/logファイルの整理と消去
------------------------------------------------------------


1	TIPS

1.1	自動的に記事のスプールを圧縮する

spool を tar.gz 形式にまとめる。おおむね 1/4 くらいになるようにおもう。
デフォールトでは100通の記事を一つの tar.gz 形式に圧縮する。
注意: tar.gz を作るだけで、圧縮したものの記事は(危ないので)消さない。
      自動的に消すには $USE_EXPIRE (次節)

	$USE_ARCHIVE
See also: $USE_ARCHIVE 

1.2	自動的にスプールの古い記事を消す
See also: 5.3 
See also: relation_EXPIRE_LIMIT_and_ARCHIVE_UNIT 

$USE_EXPIRE を 1 にすれば spool/ の古い記事を自動的に消す。これは「消
すだけ」です。

$USE_ARCHIVE と同時に使う時は注意が必要です。
See also: relation_EXPIRE_LIMIT_and_ARCHIVE_UNIT 

1.3	ログをみる

(2000/春以降の current only)

最後の10行をみる。ちなみに log と tail は一緒

% makefml log elena

最後の100行

% makefml elena::tail -100 

1.4	fml のログのチェックをする
See also: utility_programs 6.6 

/usr/local/fml/bin/daily.pl というプログラムがある。あきらかに正常とい
う以外の行(例: Article 数字)を全部表示する。
出過ぎるとおもうときはパターンファイルを変更する。

本質的には、前日のログに対して

% egrep -v -f /usr/local/fml/etc/daily.ignore ログファイル

をするのと一緒です。

    [daily ヘルプ]
    
    daily.pl [-hd] [-f patfile] [-t trap_patfile] [-p days]
    
    	-h	ヘルプ
    	-d	デバッグモード
    	-p	Ｎ日前のログを調べる。デフォールトは１
    
    	-f	無視するパターンのファイル

2	examples

2.1	アーカイブが作られる場所

	$ARCHIVE_DIR = 'var/archive'; (default is 'var/archive')

です。(default は 'var/archive' になっています)。

この内容はアーカイブの場所のリストである配列 @ARCHIVE_DIR の先頭に代入
されます。アーカイブの場所は複数あってもいいですがそれは get, mget の
時に探す対象にはなりますが、自動的に作る場所は $ARCHIVE_DIR ==
$ARCHIVE_DIR[0] です。

2.2	アーカイブの単位

何個ずつ単位でまとめるかは

	$ARCHIVE_UNIT 

で決まります。この値がないと

	$DEFAULT_ARCHIVE_UNIT (default 100)

が使われます。デフォールトは 100 です。backward compatibility のためこ
の変数がなくても 100 になります。
＃ @StoredSpool_DIR = ('var/archive'); は Obsolete な書き方です。
＃ Backward Compatibility として
＃ 内部で @ARCHIVE_DIR に代入してるので、どちらでも動きます

2.3	get コマンドとサーチパス

例えば、"get 1 " や "mget 1" というコマンドを送り込んだ時のサーチの順
番は

* Case: "get 1" and "mget 1"

1	$SPOOL_DIR (=> $FP_SPOOL_DIR)

2	@ARCHIVE_DIR

	もし 1-100 までがtar + gzipされている var/archive/100.tar.gz 
	を見つけたら記事 １ を取り出して１だけを送り返す

* Case: "mget 1-10"  command

サーチの順番は同じ。100.tar.gz が該当した時は 1 から 10 を取り出して送
り返す。

* Case: "get 100.tar.gz" and "mget 100.tar.gz"  command

var/archive/100.tar.gz をそのまま送り返す。デフォールトはこれを 
uuencode したものです。

2.4	Expire 時に Summary ファイルも作り直す

	$EXPIRE_SUMMARY = 1;

とすると Expire 時に Summary ファイルも作り直します。

3	アーカイブ, archive

fmlのスプールは一通一ファイルです。ある程度溜ると邪魔です;)
この章はＮ通を１つのアーカイブにする方法についてです。

3.1	Introduction

記事は溜ってくるとかなり場所をとります。古い記事は tar で100個くらい固
めて gzip かけると 1/4 くらいになります。
効率がいいのはヘッダとか同じようなものが繰り返し出てくるからです。
100 というマジックナンバーの目安は 100 個固めると 50K bytes 前後になる
ので好都合な値にうまくなるという経験論から来ています。

3.2	自動アーカイブと自動 expire の諸注意

ここでいう『アーカイブ』とはある程度の数のメールを一つにまとめて保存す
る(方法の)ことを意味しています。$DIR/spool に一通ずつためるのもアーカ
イブという概念だとは思いますが、このドキュメントでは区別しています。

手動でアーカイブ作成や古い記事の削除をするのがある意味で安全です。
fml に自動でそれらを行なわせることもできます。

$USE_EXPIRE (古い記事の削除)と $USE_ARCHIVE (アーカイブの作成) という
変数を 1 にすると fml がアーカイブとexpireを行ないます。

expire と アーカイブ は相反する概念です。２つを同時におこなう場合はパ
ラメータの選び方に要注意です。デフォールトはそれを考慮した数値になって
いるつもりです。

「絶対に記事はうしなわれてはいけない」という強い要求がある場合に 
「expire しつつアーカイブも作ることを全自動で行なう」ことは推奨できま
せん。というのはだれかがOSのtarやgzipを間違えて入れ換えたとかいう場合
を想定してみると危険性がわかります。expire はそういうものに依存してい
ないの普通に動いて記事を消していきますが、アーカイブは作成されなくなっ
てしまいます。よって
	『自分の設定は万全、大丈夫』
	『うちのOSはそんなことはしない、大丈夫』
	『まぁこのＭＬの記事はちょっとくらい失われてもOK』
など容認できる必要があります。

アーカイブかExpireのどちらかを自動でどちらかを手動でやるのが理想なのか
もしれません。安全性からいえばやはり『 自動アーカイブ、手動でexpire 』
が理想です。両方やる場合はアーカイブだけを設定してみて、うまくいってい
ることを確認してから expire を設定するべきでしょう。

パラメータの選び方ですが、ファイルの取り寄せ等に影響があるため必ず 
$EXPIRE_LIMIT が日数ではなく"記事の数"(残したい記事の数)で指定して下さ
い。そして次の条件

	$EXPIRE_LIMIT > $ARCHIVE_UNIT 

が必要です。念のため

	$EXPIRE_LIMIT = $ARCHIVE_UNIT * 2;

くらいにしておくのが良いでしょう。そうでない場合整合性が保証されないの
でエラーとなります。もちろん毎回ファイルを全て調べる等の莫大な 
overhead をかければ実現はできますが、コストが見合うとは思えないので実
装されていません。

3.3	何故、まとめてgzip化したいのか?

1. 一個一個gzipかけると、約半分にしかなりませんが、100個まとめて書ける
と、ヘッダとかの重なりがあるので約25%にまで圧縮できるようになります。

2. Mail-Countが万を越える頃になるといい加減 directory cache などが煩わ
しくなってきます。一つの directory の中のファイル数を減らす or ほかの
場所に移すことに意味があるようになります。そこでspoolの中身を移し、100
分の一のファイル数にすると効果が非常にあります。

4	utility プログラム

4.1	gzip file にする(アーカイブへの変換)
See also: digest 2.17 

$USE_ARCHIVE の自動操作にまかせずに時々手で もしくは cron 等でこのプロ
グラムを動かしても良いです。
See also: digest 2.17 

	archive.pl [-dh] [-A ARCHIVE_DIR][-u unit] range

	-d	debug mode
	-h	help 
	-A	アーカイブを作る場所を指定
		config.ph より強い
	-u	固める単位。デフォールトは記事１００個ずつ

	range	これで最大どの記事までをアーカイブするか強制指定
		デフォールトでは今の記事番号の直前の”１００の倍数”
		までをアーカイブの対象の記事としてアーカイブを作る。

注意:このプログラムはMLのホームで実行されることを前提にしています。つ
まり

	% cd /var/spool/ml/Elena
	% perl bin/archive.pl

のように使うことを期待されています。

これは archive.pl 2000 とかすると、2000 までのファイルを 100 個ずつの
塊にして、archiveに作ります。変数は archive.pl の先頭でセットしてくだ
さい。元のスプールは消さないので、注意を払って消して下さい
(とりかえしがききませんから、それは)
＃自分じゃ、念のため ある程度まとまったところでこうやって手動でつくっ
＃てます。

例えば、

	spool/1-100	を tar+gzip して var/archive/100.tar.gz
	spool/101-200	を tar+gzip して var/archive/200.tar.gz

のようなファイルをarchiveの下に作ります。目的のＭＬの場所にまでいって

% ls 

MSendrc		actives		config.ph	deny
guide		help		list		log
members		objective	seq		spool
summary		welcome

% test -d var || mkdir var
% test -d var/archive || mkdir var/archive
% perl archive.pl 3800

	…たくさんメッセージが出るが省略…

% ls archive

100.tar.gz   200.tar.gz 

	…たくさんメッセージが出るが省略…

spoolの 3800 までの 100 個ずつのパッケージを作りました。spoolの方の元
メールを自動的に消しはしない(安全のため)ので、自分で消して下さい。

4.2	アーカイブ作成を cron で自動処理

cronで自動的(例えば週一日曜の朝とか)に次の形で

   (chdir /var/spool/ml/Elena; /usr/local/bin/perl bin/archive.pl)

とでもすれば良いでしょう。bin/archive.sh がその見本です。いくつかＭＬ
があるなら、シェルスクリプトにまとめて呼べば楽です。まとめ送りと同様に 
crontab に記述すればよいです。

crontab の例：

	0 * * * * /bin/sh /usr/libexec/fml/archive.sh

[/usr/libexec/fml/archive.sh]

	#!/bin/sh

	(cd /var/spool/ml/Elena;    /usr/local/bin/perl bin/archive.pl)
	(cd /var/spool/ml/Freekick; /usr/local/bin/perl bin/archive.pl)

5	Expire (一定日数より古いファイルは消す)とNewSyslog

この章は「古いファイルを自動的に消す」「ローテーションしながら古いファ
イルは消えていく」動作について解説します。

5.1	Introduction

Expire(一定日数以上古いファイルを消去する方法)は従来 HOOK をかけるやり
方で実装されていましたが、正式なライブラリとして使えるようにしました。
別に中身は変わっていません。単にHOOKを書かなくても良くなったということ
だけです。

5.2	自動アーカイブと自動 expire 

『アーカイブ』はメール一通一通ではなくある程度の数を一つにまとめて保存
する方法のことを意味しています。$DIR/spool に一通ずつためるのもアーカ
イブという概念だとは思いますが、このドキュメントでは区別しています。

手動でアーカイブ作成や古い記事の削除をするのがある意味で安全ですが、
FML に自動でそれらを行なわせることもできます。$USE_EXPIRE (古い記事の
削除)と $USE_ARCHIVE (アーカイブの作成) という変数を 1 にするとFMLがアー
カイブとexpireを行ないます。

expire と アーカイブ は相反する概念です。２つを同時におこ名和させる場
合はパラメータの選び方に要注意です。デフォールトはそれを考慮した数値に
なっているため、少しDISK効率が悪いかもしれません。

「絶対に記事はうしなわれてはいけない」という強い要求がある場合に 
「expire しつつアーカイブも作ることを全自動で行なう」ことは推奨できま
せん。というのはだれかがOSのtarやgzipを間違えて入れ換えたとかいう場合
を想定してみると危険性がわかります。expire はそういうものに依存してい
ないの普通に動いて記事を消していきますが、アーカイブは作成されなくなっ
てしまいます。よって
	『自分の設定は万全、大丈夫』
	『うちのOSはそんなことはしない、大丈夫』
	『まぁこのＭＬの記事はちょっとくらい失われてもOK』
など容認できる必要があります。

アーカイブかExpireのどちらかを自動でどちらかを手動でやるのが理想なのか
もしれません。安全性からいえばやはり自動アーカイブ＋手動expireですね。
両方やる場合はアーカイブだけを設定してみて、うまくいっていることを確認
してから expire を設定するべきでしょう。

パラメータの選び方ですが、ファイルの取り寄せ等に影響があるため必ず 
$EXPIRE_LIMIT が日数ではなく"記事の数"(残したい記事の数)で指定して下さ
い。そして次の条件

	$EXPIRE_LIMIT > $ARCHIVE_UNIT 

が必要です。念のため

	$EXPIRE_LIMIT = $ARCHIVE_UNIT * 2;

くらいにしておくのが良いでしょう。そうでない場合整合性が保証されないの
でエラーとなります。もちろん毎回ファイルを全て調べる等の莫大な 
overhead をかければ実現はできますが、コストが見合うとは思えないので実
装されていません。

5.3	Config.ph Configurations

	$USE_EXPIRE = 1; (default is 0, "not expire")

にすると expire をします。デフォールトでは

	$EXPIRE_LIMIT = "7days";

で、7日つまり一週間分の記事だけを残して後は消去します。単位は
$EXPIRE_LIMIT で調整します。$EXPIRE_LIMIT のシンタックスは

	数字days (日数)
	数字	 (記事の数)

のいづれかです。例:

	7days	7日間保存
	100	最近100通の記事を残して後は消去

[参考]

参考までにHOOKを使う従来のやり方を書いておくと

   SYNOPSIS:
	&Expire(場所, 日数(以上古いファイルを消す));

例：
	$FML_EXIT_HOOK .= q#
		&use('expire');
		&Expire($SPOOL_DIR, 7);
	#;

と設定すれば、$SPOOL_DIR 以下のファイルにたいして 7日以上古いファイル
を消します（いきなり消します。注意）

例:	ファイル数で消すファイルを決める

   SYNOPSIS:
	&Expire(場所, 残しておきたい記事数, 1);

例：
	$FML_EXIT_HOOK .= q#
		&use('expire');
		&Expire($SPOOL_DIR, 100, 1);
	#;

と設定すれば、$SPOOL_DIR 以下の最新の100個のみを残して後は消去します
(いきなり消します。注意)。

5.4	expire.pl コマンドラインオプション (bin/expire.pl)

expire.pl [-h] [-e expire_days] [-s spool_directory] [-n]

    -h this help
    -e expireする日数
    -n （残すファイル数を設定して、expireするモード）
    -s スプール

6	その他のTIPS

6.1	cronでnewsyslogをする (OBSOLETE shell version)

たとえば、

0 6 * * 0 (chdir dir-of-fml; sh bin/newsyslog.sh log var/log)

とか書くわけです。msend.pl 等では

See also: 6.4 

	$NOT_USE_NEWSYSLOG = 1; (default 0)

とすると newsyslog を実行しません(default は実行)。

6.2	actives/members ファイルのバックアップ: .bak => .0 =>.1 

一般に配送リストやメンバーリストの更新が行なわれると .bak ファイルに通
常一週間分の更新がつけ足されていきます。メンバーが多いとこの .bak ファ
イルは大きくなってしまいます。現在ではファイルのサイズが

	$AMLIST_NEWSYSLOG_LIMIT	(default 50*3000 = 150K bytes)

を越えたら newsyslog (see 6.4) を使って file.bak ファイル
は var/log/file.0 に移動させるということをしています。

	file.bak       -> var/log/file.0
	var/log/file.0 -> var/log/file.1
	...

またこれとは独立にRCSによるバックアップも可能です。RCSでバックアップを
とる場合は

	$AMLIST_BACKUP_TYPE = "rcs"; (default "")

を指定して下さい。この時の .bak ファイルは更新のかかる直前の内容の 
file です。

6.3	ログファイル($DIR/log)の turn over

ログファイルがある大きさを越えたら log -> log.0 -> log.1 のようにずら
していきます。大きさの基準は次の変数にいれます。

	$LOGFILE_NEWSYSLOG_LIMIT (default "")

10K や 1M のような入力もできます。

6.4	newsyslog/logファイルの整理と消去

newsyslog(8) はログファイルを整理するプログラムです。これを簡略化した
ものをFMLは提供しています。

       Newsyslog  is  a  program  that should be scheduled to run
       periodically by crontab.  When it is executed it  archives
       log  files  if  necessary.  If a log file is determined to
       require archiving, newsyslog rearranges the files so  that
       ``logfile''  is empty, ``logfile.0'' has the last period's
       logs in it, ``logfile.1'' has the next  to  last  period's
       logs  in  it,  and so on, up to a user-specified number of
       archived logs.  Optionally the archived logs can  be  com-
       pressed to save space.

例えば、まとめおくりの msend.pl は日曜朝6時に(default) newsyslog を実
行しています。これは @NEWSYSLOG_FILES で設定されているこの3つのファイ
ルに対し古いログを順番に残し、古くなり過ぎたら消すという動作をします。

	@NEWSYSLOG_FILES = 
	   ("$MSEND_RC.bak", "$MEMBER_LIST.bak", "$ACTIVE_LIST.bak")

	rm -f var/log/members.4
	mv -f var/log/members.3 var/log/members.4
	mv -f var/log/members.2 var/log/members.3
	mv -f var/log/members.1 var/log/members.2
	mv -f var/log/members.0 var/log/members.1
	ln -s members.bak 	var/log/members.0

を実行します。必要なら この @NEWSYSLOG_FILES に これ↑をやってほしいファ
イル（log とか…）をつけくわえて、 config.ph などに書いて下さい。

@NEWSYSLOG_FILES = 
	("$MSEND_RC.bak", "$MEMBER_LIST.bak", "$ACTIVE_LIST.bak", "log")


		INDEX

$AMLIST_BACKUP_TYPE                        ...   6.2 
$AMLIST_NEWSYSLOG_LIMIT                    ...   6.2 
archive                                    ...   3 
archive.pl                                 ...   4.1 
$ARCHIVE_DIR                               ...   2.1 
$ARCHIVE_UNIT                              ...   2.2 3.2 5.2 
archive by cron                            ...   4.2 
$DEFAULT_ARCHIVE_UNIT                      ...   2.2 
expire                                     ...   5 
&Expire(場所, 日数(以上古いファイルを消す))   ...   5.3 
expire.pl                                  ...   5.4 
$EXPIRE_LIMIT                              ...   3.2 5.2 5.3 
$EXPIRE_LIMIT > $ARCHIVE_UNIT              ...   3.2 5.2 
$EXPIRE_SUMMARY                            ...   2.4 
$FML_EXIT_HOOK                             ...   5.3 5.4 
libnewsyslog.pl                            ...   6.4 
$LOGFILE_NEWSYSLOG_LIMIT                   ...   6.3 
@NEWSYSLOG_FILES                           ...   6.4 
$NOT_USE_NEWSYSLOG                         ...   6.1 6.4 
@StoredSpool_DIR                           ...   2.2 
$USE_EXPIRE                                ...   5.3 
