Linuxでの常駐型サーバプログラムのデバッグ方法

http://kzk9.net/publications/webdb48/debug.html
常駐プロセスを作る時のはまりどころや、デバッグに役立つツールが紹介されています。実際に大規模システムで起こった経験に基づいていて大変参考になります。
 
– 関連
valgrind
google-perftools
Apache Thrift – 多言語 RPC フレームワーク

ImageMagick – 画像から EXIF 情報や余分なコメント領域を削除するには

ImageMagick の convert では画像を加工しても基本的にコメント領域など付属的なデータを維持してくれます。
 
これはこれで便利なのですが画像サイズを削減したい場合はアプリケーション固有の情報(JPEG の Exif など)やコメントなどは極力取り除きたいものです。
 
ImageMagick でこれを実現するには -strip オプションを使います。
ImageMagick Command-line Options – -thumbnail

-strip
strip the image of any profiles or comments.

 
用例は次のとおりです。
 
– in.jpg から EXIF 情報等を除去し、out.jpg として保存する。

convert in.jpg -strip out.jpg

 
他の方法としては
-profile,+profile (任意のプロファイルを削除/追加する。-profile * で全てのプロファイルを削除)や,
-thumbnail (-thumbnail 320×240 は -strip と -resize 320×240 を指定するのとほぼ同じ) といったものがあります。

rsync – file has vanished

最終更新

2026年7月、内容を全面的に書き直しました。この記事はもともと2009年に Cygwin 版 rsync の文字コード問題について書いたものですが、その問題はすでに解消されているため、現在この警告で検索して来られる方の悩み(Linux などでの code 24)に合わせて作り直しています。

rsync でバックアップや同期を実行したときに、

file has vanished: "/path/to/source/some-file.tmp"
rsync warning: some files vanished before they could be transferred (code 24) at main.c(1356) [sender=3.4.4]

という警告が出て、終了コードが 24 になることがあります。

続きを読む rsync – file has vanished

[Linux] sysstat – HISTORY=28 以上だと sa ログが2重書き込みされる不具合

sysstat 7.1.2 以前で HISTORY=28 以上の設定を行うと、閏年以外の2月のログが削除されず、3月分が上書きされてしまいます。具体的には次のようなログになります。

$ date
Mon Mar 30 13:46:45 JST 2009
$ ls -l /var/log/sa/sa*28
-rw-r–r– 1 root root 474864 Mar 28 23:50 /var/log/sa/sa28
-rw-r–r– 1 root root 539834 Mar 28 23:53 /var/log/sa/sar28
$ ls -l /var/log/sa/sa*29
-rw-r–r– 1 root root 237552 Mar 29 23:50 /var/log/sa/sa29
-rw-r–r– 1 root root 270539 Mar 29 23:53 /var/log/sa/sar29
 
$ sar -c -f /var/log/sa/sar28
Linux 2.6.18-53.1.14.el5 (example.com) 02/28/09
 
00:00:01 proc/s
00:10:01 0.03
00:20:01 0.03
00:30:01 0.03
00:40:01 0.03
00:50:01 0.03
01:00:01 0.03
#### 略 ####
23:00:01 0.03
23:10:01 0.03
23:20:01 0.03
23:30:01 0.03
23:40:01 0.03
23:50:01 0.03
00:00:01 0.14
00:10:01 0.03
00:20:01 0.03
00:30:01 0.03
00:40:01 0.03
00:50:01 0.03
01:00:01 0.03
#### 略 ###
22:20:01 0.03
22:30:01 0.03
22:40:01 0.03
22:50:01 0.03
23:00:01 0.03
23:10:01 0.04
23:20:01 0.03
23:30:01 0.03
23:40:01 0.03
23:50:01 0.03
Average: 0.13

3月のログが2月のログの後に追加で書き込まれるためヘッダは2月扱いになり、2/28の23:59 の後に3/28 の 00:00:00 のログが始まります。
 
この不具合は下記のとおり sysstat 7.1.3 で修正されたようですが、CentOS 5.2 など最新版のディストリビューションでも 7.0.2-1 が最新だったりするので、HISTORY=27 として対応するなど注意が必要です。

2007/03/27: Version 7.1.3 – Sebastien Godard (sysstat <at> wanadoo.fr)
 * Better support for keeping sar logfiles for more than one month
  (several bugs fixed in sa1 and sa2 scripts).

 
sysstat 7.1.3 以降は保存形式が変わって HISTORY=28 の制限がなくなり、一年以上でも保存できるようになったようです。
 
参考:
SYSSTAT utilities home page(公式)

OpenSSH のsshで接続が切れる時の対策

OpenSSH をクライアントで使っていて, 放置していると

Connection Reset By Peer

と言われてしまった場合, クライアント側の ssh_config で

ServerAliveInterval 20
# ServerAliveCountMax 3

とすると生存確認パケットを送ってくれるようになります。
この二つのオプションは OpenSSH 3.8 からの追加機能で、
 
ServerAliveInterval は、指定秒ごとに生存確認パケットを送る。0なら無効(デフォルト0)。
ServerAliveCountMax は、サーバから返答がない時の最大再試行回数(デフォルト3)
 
となっています。
 
参考:
http://www.unixuser.org/~haruyama/security/openssh/henkouten/henkouten_3.8.txt

Apache httpd でリクエストにかかった時間をログ出力する

Apache モジュール mod_log_config

カスタムログ書式(抜粋):
%D リクエストを処理するのにかかった時間、マイクロ秒単位
%X 応答が完了したときの接続ステータス:
        X = 応答が完了する前に接続が異常終了
        + = 応答が送られた後に接続を持続することが可能
        – = 応答が送られた後に接続が切られる

自前でプロセスの所要時間を計算してログ出力したりしていました。
httpd 1.3 から 秒単位出力(%T オプション)は存在したのですね…。
灯台下暗しとはまさにこのこと。

[Linux] sar の結果からグラフレポートを作成する

kSar(http://ksar.atomique.net/) が便利。
sar のテキスト出力を GUI インターフェイスでレポート形式に変換し、PDF や画像ファイルで保存できます。
 
– sysstat で性能管理
– kSar 公式(English)
kSarでsarデータをグラフにする
kSarによるsarのグラフ化について

Linuxで間違って削除したファイルを復元する

Sleuth kit というフォレンジックツールを使うとよさそうです。Autopsy という別ツールを組み合わせれば web ベース GUI が利用できます。
 
対象ファイルシステムは: NTFS, FAT, UFS1, UFS2, EXT2FS, EXT3FS, ISO9660 です。
 
Windows 系ファイルシステムや CD などメディアのデータ復旧にも使えるのがいいですね。
 
なお, FreeBSD ports は sysutils/sleuthkit, sysutils/autopsy にあります。
参考:
http://www.gentoo.org/news/ja/gmn/20080728-newsletter.xml

SQL の JOIN の種類と違いまとめ — INNER/LEFT/RIGHT/FULL/CROSS

(2026年7月、内容を全面的に更新)

SQL でテーブルを結合する JOIN には、INNER JOIN・LEFT OUTER JOIN・RIGHT OUTER JOIN・FULL OUTER JOIN・CROSS JOIN の5種類があります。違いは一言でいえば「結合相手が見つからなかった行をどう扱うか」です。INNER は捨てます。LEFT/RIGHT/FULL は残して NULL で埋めます。CROSS はそもそも条件を付けず、全組み合わせを作ります。

答えとしてはこれで全部です。ただ、この一言だけを頼りに書いた SQL は、たいてい「思ったより行が少ない」「NULL の行はどこへ消えた」という形でつまずきます。そこでこの記事では、結合相手のいない行をわざと混ぜたサンプルデータに5種類の JOIN を順にかけて、結果がどう変わるかを目で確認していきます。あわせて結合条件の書き方(ON/USING/NATURAL)の違い、複数 JOIN の評価順、データベースごとの対応差(MySQL に FULL OUTER JOIN がない、など)もまとめます。

続きを読む SQL の JOIN の種類と違いまとめ — INNER/LEFT/RIGHT/FULL/CROSS

[Linux] メール自動受信処理のための procmail 入門

はじめに

procmail とはメール受信時の振り分け、フィルタリングなどを行うためのメール処理プログラムです。
Procmailが使える環境なら、レシピを書くだけでメール受信時に好きなプログラムで自動処理することができます。

たとえば、こんなことに使えます。

− メールが届いた時に、お礼メールを自動応答をする
– メールが届いた時に、自動で他の誰かに転送する
– スパムメールを自動で捨てる
– メモを書いたメールを送ったら、内容をデータベースに保存してくれるシステム
– 添付画像つきメールを送ったら、添付画像を自分のサイトで公開するシステム
– 問い合わせメールを管理画面で見えて、そのままメール返信ができるシステム
– などなど。

とにかく、

「メールを特定のメールアドレスに送ったら○○が✕✕する」

という処理のきっかけ(開始地点)として、procmailが使えます。

使ってみる

Procmailを使うには、メールサーバに Procmail が入っていることが前提です。

メールサーバ構築方法についてこの記事では省略します。
たとえばメールサーバとしてPostfixを使う場合は、以下の記事を参考にしてください。

この記事ではProcmailインストール方法はCentOS(RedHat Linux)、Postfixを使った場合の説明をします。
利用方法はOSによらず共通です。

procmailをインストールする

which procmail

とたたいて、 /usr/local/bin/procmail のように、パスがかえってくればOKです。

パスが何も結果がかえってこなければ、

sudo yum install -y procmail

と実行してインストールします。

インストールしたら、Postfixの設定ファイル main.cf の、mailbox_command設定を探して、以下のように追記します。
mailbox_commandが見つからなければ、main.cfのどこに入れてもOKです。

/etc/postfix/main.cf:

#mailbox_commandが並んでる最後の行に・・・
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
#mailbox_command = /usr/local/mybin/procmail_wrap
#↓これを追記する!
mailbox_command = /usr/bin/procmail

/usr/bin/procmail は、自分の環境で

witch procmail

として出てきたパスを入力してください。

procmailを使う準備

procmail のルールを書くためには、まずメール受信ユーザのホームディレクトリに
以下の内容をもつ .forward ファイルを作成します(両端のダブルクォーテーションも必要)。

"|IFS=' '&amp;&amp;exec procmailのフルパス -f-||exit 75 #ログインユーザ名"

例:
/home/john/.forward を追加する場合…

"|IFS=' ' &amp;&amp; exec /usr/local/bin/procmail -f-||exit 75 #john"

最初と最後のダブルクオーテーションが無いと正しく動かず、超ハマるので注意してください。

procmailのルールを書く

次に同様に .procmailrc ファイルを作成します。

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/.procmail.lock

<h1>--- 例1:未承諾広告を捨てる</h1>

:0 H
* ^Subject:.<em>iso-2022-jp
* ^Subject:.</em>\/.*
* ? echo "$MATCH" | nkf -me | egrep '※未承諾広告'
/dev/null

<h1>--- 例2:エイリアスによる [email protected] 宛のメールの内容(ヘッダ含む)を /usr/local/bin/dosomething.sh に渡して実行する</h1>

:0
* ^To:.*[email protected]
| /usr/local/bin/dosomething.sh

例1はメールフィルタリングの例です。
例2はメールをトリガとして任意のプログラムを実行する例です。この例では、/usr/local/bin/dosomething.shにメールの内容を標準入力で渡して、実行しています。
このように好きなプログラムにメールヘッダ・本文を渡して実行することで、自動応答メール等様々な用途で利用できます。

補足

~/.forward がない場合は、main.cf の mailbox_command 変数で指定されたコマンド, mailbox_cmmand も指定されていない場合は通常のメール配送を行います。

また、procmail を実行した時に ~/.procmailrc がない場合も(procmail が)単純にメール配送を行います。

仮想ドメイン・仮想ユーザを使っているPostfixでProcmailを使う方法

仮想ドメインのメールボックスでは .forward ファイルおよび main.cf での mailbox_command は参照されないため、 procmail 等コマンド実行は適用されません。
このため、仮想ドメインのメールアドレスで procmail を扱うためには virtual_alias_maps で、procmailを使いたいメールアドレスのみ、ローカルのリアルユーザにエイリアス(紐付け)する必要があります。

例: [email protected] 宛のメールをリアルユーザ mailuser で受け取る場合…

/etc/postfix/main.cf:

#...略...

#@ecoop.net のみリアルユーザとする(仮想ドメインを含めないこと)
mydestination = localhost

#...略...

#仮想メールアカウントのエイリアス
virtual_alias_maps = hash:/etc/postfix/viatual

#仮想メールアカウントのメールボックス
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps

/etc/postfix/virtual:

[email protected]   [email protected]

/etc/postfix/virtual_mailbox_maps:

#(エイリアスしたものは含めません)
#example.com
[email protected]         example.com/info
[email protected]   example.com/postmaster
[email protected]         example.com/postmaster

#example.net
[email protected]         example.net/info
[email protected]   example.net/postmaster
[email protected]         example.net/postmaster

設定ファイルの書き換えが終わったら、設定を反映するため以下のコマンドを実行します。

su - # root ユーザで行う
cd /etc/postfix
postmap hash:virtual_mailbox_maps
postmap hash:virtual
postfix reload

あとは前述のとおり mailuser のホームディレクトリ(例: /home/mailuser/ )に .forward, .procmailrc を作成すれば、
[email protected] に対して procmail のルールが書けるようになります。

参考:
Advanced Email Forwarding
Manpage of PROCMAILRC(JM Project による和訳)
Postfix 設定パラメータ
.procmailrc の書き方
Virtual環境での.forward が有効になりません(postfix-jp: 425)
Postfix 設定パラメータ