rubyスクリプトのエラーメッセージ(標準エラー出力)を標準出力にリダイレクトしてもメッセージが表示されないという謎の現象

Webサイトをクロールしてその結果をデータベースに保存するというrubyスクリプトを作成して、Debian lenny化した玄箱Pro上で24時間実行しています。

ところが、決まった時刻になると上記のrubyスクリプトが異常終了してしまいます。

rubyスクリプトを実行すると、rubyのシステムから出力されるエラーメッセージは、通常、標準エラー出力に出力されるため、以下の情報を参考に標準エラー出力を標準出力にリダイレクトしています。

UNIXの部屋 コマンド検索: リダイレクト

% command >file 2>&1

こうすれば、rubyスクリプトが異常終了してもエラーメッセージが残せるはずなので、後から原因解析できるはずだと考えました。

ところが、rubyスクリプトが異常終了しても、rubyのシステムが出力するエラーメッセージがリダイレクトしたファイルに出力(記録)されません。

ググってみたところ、標準出力はデフォルトではバッファリングされているので、異常終了時のエラーメッセージが標準出力のバッファに溜ったままで出力されないらしいということがわかりました。

そこで、↓のように、標準出力と標準エラー出力のリダイレクト先のファイルを別々にしたところ、きちんとrubyのシステムのエラーメッセージが記録されるようになりました。

% command >file.txt 2>err.txt

また、rubyでは、↓のようにすると、標準出力のバッファリングをオフにすることができるので、確実に標準出力の結果をリダイレクト先のファイルに出力(記録)することができます。

これなら標準エラー出力を標準出力にリダイレクトしてもきちんとリダイレクト先のファイルにrubyのシステムのエラーメッセージを出力(記録)できます。

http://www.atdot.net/~ko1/w3ml/w3ml.cgi/mandiff@ruby/msg/2561

STDOUT.sync = true

広告

rubyスクリプトのエラーメッセージ(標準エラー出力)を標準出力にリダイレクトしてもメッセージが表示されないという謎の現象” への3件のフィードバック

  1. 通常のスクリプト異常終了なら、exit(3)が呼ばれてストリームはフラッシュされると思っていましたが、何か特殊な例外ハンドリングをしているのでしょうか?

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

w

%s と連携中