mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - cronで「invalid byte sequence in US-ASCII」例外発生!

[ プログラミング ] [ Linux, Ruby ]

こんばんは。

LinuxでRubyスクリプトを普通に実行してもエラーとならないのに、このRubyスクリプトをcron登録して実行すると以下のような例外が発生することがあります。

1
invalid byte sequence in US-ASCII

RubyでHTMLを解析・編集するライブラリ 「 hpricot 」 を使用している場合にcronで実行すると 「 US-ASCII 」 として処理しようとして例外が発生しているようです。 ( Ruby1.9でのみで発生。Ruby1.8では発生しない模様。 )

【 2012.11.14 追記 】 この現象は、Rails アプリから Ruby スクリプトを実行した際にも発生する場合があります。 この場合も、以下の 3 については同様に対応が可能です。

調査してみたところ、解決方法が3つ見つかりました。

解決方法

元のRubyスクリプトがUTF-8エンコードされていることが前提です。 (Shift-JISエンコード等については未確認です)

1. Rubyバージョンを1.8に下げる

この例外はRuby1.9系で発生し、Ruby1.8系では発生しません。どうやらRuby1.9からは文字コードの扱いが変わったようです。 1.9系のRubyをインストールしている場合は、1.8系にインストールし直す。

2. cron内で文字コードを指定する

cronでの実行時に文字コードの部分で例外が発生しているので、cron内に文字コードを指定する記述を追加する。

1
2
3
LC_CTYPE=ja_JP.utf8
LANG=ja_JP.utf8
10 0 * * * root /usr/local/bin/ruby /home/src/hoge.rb &> /dev/null

3. cron内で文字コードを指定して実行する

これが一番手っ取り早い方法です。Ruby実行時に文字コード “-Ku” を指定します。

1
10 0 * * * root /usr/local/bin/ruby -Ku /home/src/hoge.rb &> /dev/null

参考にしたサイト


当方は一番簡単な3の方法で対応しました。

以上。

Comments