#この記事について
先日現場で、掲題の原因によるトラブルが起こったので覚書として。
crontabで、行末の改行コードがCR+LFだと正常に動作しない模様。
無論、Linux環境で作業している限り改行コードはLFとなるはずで、このようなことは普通起こらないが
Windows環境で作成したファイルをLinux環境に転送し、crontabに読み込ませると起こりうる。
ファイルの読み込み時にエラーも表示されず、登録されてしまう。
改行コードに限らず、文字コード等の問題もあるので
そもそもWindowsでcrontabファイルを作成して適用するような運用には注意が必要だろう。
#現場で実際に起きた事例
複数台で運用中の本番環境APサーバのうちのいくつかに、ある担当者がcrontabを設定したが、それが動かない。
担当者はcrontab登録済の他のAPサーバの設定内容を見ながら、Windwosの開発端末のメモ帳で同一内容の設定ファイルを作成して
本番環境に転送し、crontabに適用するという手法をとっていた。
設定した内容は、以下であると仮定する。
05 * * * * sh /home/hogeuser/example1.sh
10 * * * * sh /home/hogeuser/example2.sh
15 * * * * sh /home/hogeuser/example3.sh
##原因判明までの手順
事象発覚後、以下の手順で調査実施。
-
/etc/rc.d/init.d/crond status
にてcrondが起動しているかどうか確認 → 起動していた - 実行させるシェルスクリプトのパスが正しいか確認 → 正しかった。スクリプトの実行権限も問題なし
- 既存のAPサーバではジョブが動いているか確認 → 動いていた。動いていないのは今回crontabの設定を行ったサーバのみ
- crontabのエラーログについては、root権限が必要だったので確認できず
- シェルスクリプト以外なら動作するのか確認するため
*/1 * * * * echo test >> test.txt
のジョブをcrontabに追加 - 結果
'test.txt'$'\r'
という異常な名前のファイルが生成された。ここで改行コードの問題を疑う -
crontab -l > crontab.txt
で登録内容をファイルに出力しod -c crontab.txt
で改行コードを確認 - 案の定、改行コードがCR+LFだった
##対応
既存のAPサーバでcrontabに登録されているジョブの内容をcrontab -l > crontab.txt
で出力。
生成されたcrontab.txtを事象発生中のサーバに転送し、crontab crontab.txt
で登録しなおした。
結果、登録したジョブが定刻通りにエラーなく実行されるようになったことを確認。
#おわりに
最初に記載した通り、Windowsで作成したファイルをcrontabに適用するような運用は要注意です。
本記事で述べた改行コードの件のみならず、文字コードの不一致という問題も起こり得ます。
また、ファイル最終行に改行をつけ忘れるという問題も発生する可能性があります。
これはUNIX使いの方には「そんなの当たり前だろ」と言われてしまうかもしれませんが
シェルスクリプト等をWindowsで作成し、それをサーバに転送して実行するようなことは
結構、各所で行われているんですよね…。
以前私が作成した記事にも記載していますが、crontabへのジョブ登録はcrontab -e
では行わず、
常にファイルを読み込ませる方式で行うべきと考えていましたが、このような問題も起こり得るということを今回認識しました。
日々是精進ですね。
参考記事
cronでシェルスクリプトが動作しない時に確認すべきこと:https://qiita.com/halpas/items/74e8c2ed2b94588cb362