2012年08月14日

【嵌りました】CRONで動かない! cron jobに環境変数LANGは引継がれず

 cron設定では、時々、上手く自動実行出来ずにあたふたすることがあるが、それは概ねスクリプトの実行権限設定なり、/etc/cron.d/内のファイル記述ミスの問題で、crondの実行タイミングを避けて「sudo service crond.restart」辺りでcrondのサービスを再起動させ認識させてば次回の実行タイミングから実行される。

 しかし、今回、前稿の「HP ProLiant ML110 G7 OSレスモデル 6473360-AHZN」のセンサー値のDB書込みPythonプログラムに、im_sensors経由のCPU Coreの温度センサー値を附加したところ、手動ではDB書込み迄実行出来るものの、crondでは、どうもim_sensorsの処理のところで例外発生で異常終了してしまっている様だった。
 その間のDB書込みは、これ迄のipmiの分迄は追加スクリプトの前に記述し個別にcommit迄される仕様としたので事なきを得たが、手動実行時と異なり、明示的な例外処理記述をしていないもののcron job実行のメッセージは「/var/log/messages」に次の様に、「何かあったよ!」程度の目立たないログを残す程度であり、今回は真の原因を見逃してしまいcrondの使い方の誤り思い込み右往左往してしまった次第だ。
「 abrt: detected unhandled Python exception in '/usr/local/bin/ipmi_and_sensors.py'」

 原因は首記の通りcron job実行では「環境変数LANGが引継がれない仕様」だからで、その為、im_sensorsのデータ取得で活用した「sensors」コマンドの実行時にlocaleに「LANG=ja_JP.UTF-8」が適用されない為、出力文字に変化があり、pythonの文字列処理で不測の事態を生じたからであった。それでは、先ずは、このことを
確認する為の簡単なcron jobを示し「cron jobにrootの環境変数LANGは引継がれない仕様」を明らかにしよう。

 先ずは、コンソール上の手動実行で「locale」コマンドを実行して試ると、今時の日本語設定のLinuxなら、次の様な出力となることだろう。これは、例え「su -」でrootになってから実行しても通常は変わらない。



[mire@localhost ~]$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
[mire@localhost ~]$ su -
パスワード:
[root@localhost ~]# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
[root@localhost ~]#

 しかし、この、「locale」コマンドをcron jobとして実行させるとその吐く結果は何と次の様に変わってしまう。はい、「LANG=ja_JP.UTF-8」は完全に消え通貨、氏名、住所、尺度単位等が「"POSIX"」を値としていることが判る。



[root@www bin]# tail /var/log/check_locale_of_cron_job.log
LANG=
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
[root@www bin]#

 貴方の環境で確かめたいなら次の記述を加えた上で「sudo service crond restart」をcron job実行タイミング(通常は0分から5分刻み)を避けて変更を強制認識させた後、cron job実行タイミングが過ぎてから「tail /var/log/check_locale_of_cron_job.log」等の形で中身を確認頂くだけだ。
            /etc/cron.d/check_locale_of_cron_job
*/5 * * * * root /usr/bin/locale >> /var/log/check_locale_of_cron_job.log

 もし、出来ないなら、/etc/cron.d/check_locale_of_cron_jobのファイル記述の最後に改行があるかどうかを確認し無ければ改行を附加して「sudo service crond restart」し、それでも駄目なら「/var/log/」への新規ファイル作成権限を疑い手動で「/usr/bin/locale >> /var/log/check_locale_of_cron_job.log」を実行した上で、「/var/log/check_locale_of_cron_job.log」の存在を確認頂きたい。もし駄目でも後は適宜「/var/log/cron」と「/var/log/messages」で原因を探れば確認頂ける筈だ。

 さて、この「cron jobには環境変数LANGが引継がれない仕様」の対策は、色々とあるが、今回は、「cron jobには環境変数LANGが引継がれない仕様」であることを前提に「cron job」実行時の出力に合致したpythonコードに変更することにした。今回は「℃」の丸点がUTF-8ではあるがASCIIではないことから起きたものであり、見た目の表記として「°」と半角「C」の組合せや半濁点「゜」との組合せと区別がつき難いこともあり、紛らわしい文字が綺麗サッパリ出力されないsimpleな出力となるcron jobとしての出力を正としてをコーディングを修正した。

 しかし、このやり方では、日本語メッセージを含むコードには対応しない。もし、cron jobで日本語を扱いたければ、コマンド実行毎にその頭に「LANG=ja_JP.UTF-8」を半角スペースを1つ挟んで実行する様にするのが最も妥当であろう。また、当方では全体への影響を踏まえ実施しないが、「/etc/environment」に「LANG=ja_JP.UTF-8」の行を追加し「sudo service cron restart」する方法もある様だ。

 「cron jobにrootの環境変数LANGは引継がれない仕様」については、この着眼さえ出来ればググれば、それなりの情報が得られる。本稿と同じ内容は英語ながら、「Locale settings for your cron job | LogikDevelopment」があったし、日本語では「@IT」にも、「cron に実行させると日本語が ? になる」の情報が課題解決に継がるだろう。

 LANG変数を指定した実行方法は、これ迄も何気なく、指示通りに使って来たが、余り深く認識して居なかったことも解決を遅らせた要因であった。あぁ、まだまだ、厨だなぁ(苦笑)。
posted by Mire at 14:46 | Comment(0) | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
月額見放題1,000円開始キャンペーンバナー(画像ありver)
紺碧の艦隊 ルパン三世 GREAT CHASE クリックプロモーション
<< 2013年01月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
カテゴリ
タグクラウド
ファン
利用中のオープンソース
最近のコメント
最近の記事
過去ログ
QRコード
レガシーなアプリはいかが?
Dell 法人のお客様ページ
  • 【法人様向け】デル、お得なキャンペーン情報
  • 法人のお客様向け ストレージソリューション
  • 法人のお客様向け ネットワークソリューション
  • 【SOHO法人様向け】デル・オンライン広告限定ページ
  • デル-個人のお客様ページ
  • 【個人のお客様向け】デル・オンライン広告限定ページ
  • オンライン広告限定キャンペーンページ
  • ソフトウェア&周辺機器 パソコン工房
    ツートップインターネットショップ(twotop.co.jp) マウスコンピューター/G-Tune
  • ×

    この広告は1年以上新しい記事の投稿がないブログに表示されております。