シェルスクリプトをcronで動かそうとしてドはまりしたのでメモ。

test.plt :

set terminal png
set output "test.png"
plot sin(x)

test.sh :

#!/bin/bash
gnuplot test.plt

というスクリプトを書いて手で実行するとtest.pngが作られるが、cronに登録して実行するとほとんどの環境では動かない。なぜならgnuplotのパスは/usr/binなどだが、大抵の環境ではcronして立ち上がったシェルにそのパスが通っていないから。なので、フルパス指定するとgnuplotは動くようになる。


cutコマンドは日本語ロケールに対応しているため、文字数を数えるときに全角文字も1文字分として数えてくれる。

% echo "あいうえお" | cut -c 3-4
うえ

% echo "あいうえお" | cut -d "う" -f 2
えお

というように、区切り文字にも日本語(1文字)が使える。しかしそのままcronスクリプト内で使おうとすると-cオプションではうまく切り出せず、-dオプションはエラーとなる。これもやはりcron実行時に環境変数LANGが設定されていないことが原因である。設定されていない場合、cutコマンドはLANG=Cとして動作する。このため、日本語文字列はバイナリとみなされてしまい、-cでは-bと同じ動作に、-dは2文字(バイト)以上を指定しているためエラーとなる。これを回避するためにはスクリプトの先頭で

export LANG=ja_JP.eucJP

などとロケールを設定すればいい。