Ruby - cronで「invalid byte sequence in US-ASCII」例外発生!
Updated:
LinuxでRubyスクリプトを普通に実行してもエラーとならないのに、このRubyスクリプトをcron登録して実行すると以下のような例外が発生することがあります。
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内に文字コードを指定する記述を追加する。
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” を指定します。
10 0 * * * root /usr/local/bin/ruby -Ku /home/src/hoge.rb &> /dev/null
参考にしたサイト
当方は一番簡単な3の方法で対応しました。
以上。
Comments