treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

cronの実行結果メールで全角文字だけ表示されなくなる

Linuxのタスクスケジューラcron。実行結果をメールで教えてくれるので便利です。rsyncの定期実行に使っているのですが、その結果メールが上手く表示されなくなったので対処をご報告です。

症状

アラートメールを送信する専用のSMTPサーバが故障したので、急遽Debianとpostfixで急仕上げのSMTPサーバを用立てて対処しました。

しかし、その後から今まで正常だったcronで実行しているrsyncの実行結果メールに「全角文字が表示されない」という症状が出るようになってしまいました。

メール例:

ファイル名やパスに含まれる全角文字がすっぽりなくなって半角英数字しか表示されなくなってしまうということで、これを対処することにしました。

考えてみたこと

cronの実行結果メールは以前の(故障して起動しなくなった)メールサーバ経由で送信していた時は全角文字が正常に表示されていました。
例えば、
</home/user-1/Document/表計算/一覧表.xlsx>
と表示されるべきところが、今回の症状が発生したメールでは、
</home/user-1/Document//.xlsx>
という具合に、全角文字のところだけがすっぽりなくなった状態で記載されています。

メールサーバが変わったことで、これまで取り扱っていた書式情報が変わってしまった?という仮説から対処を考えてみることにしました。(ここに至るまでしばらく時間がかかりましたが)

対象のメールを調べてみる

前の図にあったメールヘッダを確認すると、

--------------------------------------------------------------
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
--------------------------------------------------------------

ん?メールの「Content-Type」のcharsetがUS-ASCIIとなっています。文字コードUTF-8でロケールの設定を統一していたはずなのですが、何かの拍子に変わってしまったのでしょうか?(もしくはこのままでも動作していたから気づいていなかっただけ、という可能性も高い。)

これをUTF-8にすれば全角が表示されるんじゃないかと考えて、二つの設定を改めて実施してみました。

crontabに追記

UTF-8にするには、シェルスクリプトの実行時にデフォルトの言語を指定しておけばいいんじゃないかと考えて、まずはcrontabで設定してみることにしました。

crontab -e

で以下を追記してみます。

--------------------------------------------------------------
LC_ALL=ja_JP.UTF-8
CONTENT_TYPE=text/plain; charset=UTF-8
LANG=ja_JP.UTF-8
--------------------------------------------------------------

結果は残念ながら変わらず、「charset=us-ascii」のままでした。

シェルスクリプト本体に

それならと、rsyncの実行コマンドを羅列したシェルスクリプト本体の先頭「#!/bin/sh」に続けて「export LANG=ja_JP.UTF-8」と記載してみることにしました。※シェルスクリプト自体はrsyncの実行コマンドを羅列しただけの単純なシェルです。

--------------------------------------------------------------
#!/bin/sh
export LANG=ja_JP.UTF-8
--------------------------------------------------------------

「export LANG=ja_JP.UTF-8」を追記してみました。

その結果、

cronから送信されるメールは、

----------------------------------------------
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
----------------------------------------------

「charset=utf-8」とメールヘッダに記載されるようになり、UTF-8で送信されるようになりました。

この結果、表示されなかった全角文字が再び表示されるようになり、cronの実行結果メールが正常に戻りました。

シェルスクリプト本体にLANG指定するのが重要だった、ということになります。

crontab側の文字コード設定は消してみると再発

シェルスクリプトでLANG指定することでうまくいったので、試しにcrontab側のLANG設定はコメントアウトしてみることにしました。

先ほど追記した三行を

--------------------------------------------------------------
#LC_ALL=ja_JP.UTF-8
#CONTENT_TYPE=text/plain; charset=UTF-8
#LANG=ja_JP.UTF-8
--------------------------------------------------------------

行頭に「#」をつけてコメントアウト、いったん無効化して、実行された結果をメールで受け取ってみることにします。

cron実行を待って送られてきたメールを確認してみたところ、冒頭のような全角文字が抜けるメールになってしまいました。

と、いうことは、crontabとシェルスクリプト本体の両方にLANGでUTF-8指定を入れないといけないという結論でこの事象の対処を終えることになりました。