So-net無料ブログ作成
検索選択
スポンサードリンク

シェルスクリプトは動くけど、cronで動作するとエラーになる原因。 [Linux]

シェルスクリプトは動くけど、cronでは動作せずエラーが出るときの原因メモ。

ユーザでログインし、シェルスクリプトで動作テストは問題なく動作する。
$ test.sh
OK

しかし、そのシェルスクリプトをcronで設定すると動作しない。
crontab -l
10 * * * * /home/test.sh
NG

どうやら、ログインしてシェルスクリプトを実行するのと、cronでシェルスクリプトを起動するのでは
環境が違うもよう(当たり前ですが)。
特にありそうなのが、PATHと文字コード。
まずはシェルスクリプトが動作する環境のPATHを確認。
$ echo $PATH

出てきた結果をcrontab -eで最初の方に記載する。
crontab -l
PATH=/usr/local/bin:/usr/sbin/:・・・・

文字コードの確認をする。
$ echo $LANG

出てきた結果を、実行スクリプトの前に記述する。
crontab -l
10 * * * * export LANG=ja_JP.UTF-8; /home/test.sh
※日本語、UTF-8の場合。

全部のスクリプトに割り当てる場合は先頭に設定を入れる。
crontab -l
LANG=ja_JP.UTF-8
※日本語、UTF-8の場合。

で、動作するようになるはず。
基本的にはデフォルト設定で問題無く動作すると思うのですが、後からインストールしたものや
追加した環境が有るとなりやすいかも。
OSを英語環境でインストール後に日本語環境を追加とか、rubyやpython3を追加しそのプログラムを
実行したときや、サードパーティー製アプリをインストールしそのプログラムを実行するなどかな。

それ以外のcronのメモ。
cronの結果メールが不要な場合。
crontab -l
MAILTO=""
メール送信先を変更する場合。
MAILTO="hogehoge@hogehoge.jp"

特定のスクリプトだけログを出さないようにする場合。
crontab -l
10 * * * * /home/test.sh > /dev/null 2>&1

個別のログへ出力する場合。
10 * * * * /home/test.sh >> /tmp/ok.log 2>>/tmp/error.log
標準出力はok.logへ、標準エラーログはerror.logへ出力する。

個別でメール送信をする場合。
10 * * * * /home/test.sh 2>&1 | Mail hogehoge@hogehoge.jp

cronで実行するものによって、使い分けるようにしたほうが良さそうですね。

スポンサードリンク
シャンパン酵母エキス