Failure Sharing

Bootup your energy with sharing failure.

バッチを作るときは、cronにて確認する習慣を身につけよう。

背景

最近、タイムスタンプに基づいて、ファイルが特定の時点から変更があったかどうか確認するシェルを実装したんですけど、 なぜかcrontabで実行したら、ちゃんとした結果が得られませんした。

シェルについて

test.sh
#!/bin/sh

echo "**** Timestamp test ****"
ls -l | head -3

echo "**** /Timestamp test ****"

このシェルの実行結果は、以下となります。

P46575:study woohyeok.kim$ ./test.sh 
**** Timestamp test ****
total 619544
drwxr-xr-x@ 11 woohyeok.kim  INTRA\Domain Users        374 Aug 13 09:56 HotelReservation
-rw-r--r--@  1 woohyeok.kim  INTRA\Domain Users   34425086 Jul 19 16:56 Maven Project for ATDD hands-on exercise.zip
**** /Timestamp test ****

cronに登録

このシェルをクーロンに登録して、また実行の結果を見てみます。

crontab
20 * * * * /Users/woohyeok.kim/Desktop/study/test.sh >> /Users/woohyeok.kim/Desktop/study/test.log 2>&1

したら、出力が

**** Timestamp test ****
total 7296
drwx------@   7 woohyeok.kim  INTRA\Domain Users      238  8 13 10:19 Applications
drwx------    2 woohyeok.kim  INTRA\Domain Users       68  3 28 13:23 Box Sync
**** /Timestamp test ****

タイムスタンプの形が違うんです。

なぜ?

実はクーロン上に、こういう変数が宣言されてました。

LC_ALL=ja_JP.UTF-8

何が言いたいかというと、 クーロンって、あくまで自分のジョブスケジュールなので、実行するユーザは同一ではありますが、 環境変数のスコープなどによって、普通にコマンドを叩く時と結果が違う恐れがあるということです。

それが?

せっかく実装して、上司に終わりましたーって報告したのに 実はクーロン上では動作しないシェルだったらどうでしょうか。

そういうのを防ぐために、シェルを実装するときは、いつもクーロンで試してみましょうー