Home

技術系のメモと日々の雑感

Postfix が遅かったら delays を見よう

とあるサーバの Postfix が配送に時間がかかっていたのでログを眺めていたら delays という値があることに気づいた。

Aug 27 10:37:42 mail01 postfix/smtp[4363]: F1EA337B2D2: to=<hoge@example.com>, relay=xxxx.xxxxxxxxx.xxx[XXX.XXX.XXX.XXX]:25, delay=98, delays=0.01/0/14/84, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 754F720056)

4つの値が何を表しているのか分からなかったのでググってみると、ソースに含まれる RELEASE_NOTES に書いてあるとのこと。
といってもこれは過去のバージョンの話で、自分が使っている 2.5.6 のドキュメントの中では HISTORY の 2005/11/02 のところに記述があった。
って、そんな前からあったんだね・・・。

Completion of support for time stamps from different stages of message delivery.
The information is now logged as "delays=a/b/c/d" where a=time before queue manager, including message transmission;
b=time in queue manager; c=connection setup including DNS, HELO and TLS; d=message transmission time.

以下、delays の説明部分に書いてあるほとんどそのままだけど。
a は qmgr が処理する前の時間。
including message transmission ということなので、smtpd が外部からのメールを受信する時間とか、pickup がキューを走査する時間も含まれてるんだろうな。
b はそのものズバリ qmgr が使った時間。
c は次の配送先への接続の準備に使われた時間。
DNS に問題がないのにこの値が大きかったら、HELO が完了するまでに何かが起こってるということか。
d は配送に使われた時間なので、smtp が別のサーバに送ったり、local がスプールに保存するのにかかった時間だね。

シェルスクリプトから手軽に日本語のメールを送る

例によって自分用のメモだけど。
シェルスクリプトでメールを送るとき、JIS コードに変換しなければならないのがちょっとだけ面倒だね。
本文はヒアドキュメントにしておきたいけど、普段使ってる CentOS では UTF8 がデフォルトだからそのままでは文字化けするし。
だからと言って JIS コードに変換して保存すると本文を修正しにくくなるし。
そんなこんなでいい方法がないか考えているうちに、ヒアドキュメントを nkf に通すという手を思い付いた。

#!/bin/sh
MAILTO='hoge@example.com'
SUBJECT='Mail from shellscript'
nkf -j <<EOT | mail -s "$SUBJECT" $MAILTO
文字化けしないよ!
EOT

これなら何の文字コードで書いていても本文をすぐに修正できる。
悪くないかも。

ファイルの特定行以降を削除するには

とあるシェルスクリプトを組んでいたときのこと。
ファイルの特定の行より後をカットしたくなった。
例えば、/etc/yum.repos.d/CentOS-Base.repo の contrib リポジトリより後はいらないといった場合だ。
ちょっと考えてみて、これといっていい方法が浮かばなかったので

cp CentOS-Base.repo CentOS-Base.repo.bak
perl -ne '$flg=1 if(/^#contrib/); print if($flg==0);' CentOS-Base.repo.bak > CentOS-Base.repo

と書いて済ませておいた。
う〜ん、イマイチ。
他にいいやり方はないかな。

rename コマンドで一括変換

次のようなファイルが大量にあって、各ファイルのアンダーバーをハイフンに置き換えないといけなくなった。

# ls -l
合計 0
-rw-r--r-- 1 root root 10  8月  7 10:28 hoge_001
-rw-r--r-- 1 root root 10  8月  7 10:28 hoge_002
-rw-r--r-- 1 root root 10  8月  7 10:28 hoge_003

こういうのってスクリプトを組まないと無理だという先入観があったけど、rename という便利なコマンドがあるんだね。

# rename '_' '-' hoge*
# ls -l
合計 0
-rw-r--r-- 1 root root 10  8月  7 10:28 hoge-001
-rw-r--r-- 1 root root 10  8月  7 10:28 hoge-002
-rw-r--r-- 1 root root 10  8月  7 10:28 hoge-003

たまにしか使わないから忘れないようにメモ。

NFS と TCP Wrapper

CentOS 5.0 の頃に設定した NFS の環境を CentOS 5.3 に移したらクライアントからつながらなくなってしまった。

mount: mount to NFS server 'XXX.XXX.XXX.XXX' failed: RPC Error: Authentication error

と、ありがちなメッセージしか返してくれない。
設定は 5.0 のをそのまま引き継いでいるんだけどな〜。
調べているうちに、hosts.allow で portmap だけ許可していたのを ALL で許可すると通ることが分かった。
ふ〜ん。
以前は portmap だけを許可すればよかったはずだけど、他にも TCP Wrapper で制限がかけられるようになったということか。
portmap は NFS だけが利用してるわけじゃないから、これが正しい流れなのかもしれないね。
さらに調べてみたら、原因は rpc.mountd だった。

portmap:XXX.XXX.XXX.XXX
mountd:XXX.XXX.XXX.XXX

rpc.mountd の指定がプロセス名と違ってるところが落とし穴だね。