cron実行時と同じ環境でテストする

ALL
スポンサーリンク

cronでの処理がエラーとなって、うまく動作しない場合、毎回cronで動かしてみるのは面倒なので、cron実行時と同じ環境でテストできるようにする方法です。

下記で紹介されていた方法です。

linux – Test run cron entry – Stack Overflow

準備

ここでの作業は、一度実施すれば、以降はどのcronスクリプトのテストでも再度の作業は不要です。

まず、最初だけ、cronで次を実行させます。
username の箇所は、cronを実行させたいユーザ名を指定してください。

* * * * *  /usr/bin/env > /home/username/cron-env

cronエントリに記述後、1分位したら /home/username/cron-env が出来ます。
cron から上のエントリを削除してください。

続けて、次の内容でファイル run-as-cron を作成します。

#!/bin/sh

. "$1"
setsid /usr/bin/env -i "$SHELL" -c "set -a; . $1; $2" </dev/null

実行権をつけます。

chmod +x run-as-cron

cronと同じ環境でテスト実行

次のようにして、cronで実行したい内容を ” で括って指定して、「準備」で作成したrun-as-cronを実行します。引数のないコマンドの場合は ” は省略できます。
cron-env はパスで指定してください。カレントディレクトリにある場合も、./cron-env と指定します。

./run-as-cron ./cron-env ls
./run-as-cron ./cron-env 'ls -la'

たとえば、Ubuntuで次のように実行すると、

./run-as-cron ./cron-env route

次のようにエラーになります。これはcron環境では、routeコマンドがある/sbin/にパスが通っていないためですが、cron実行時に起こるエラーがこのように確認できます。

/bin/sh: 1: route: not found

他には、docker環境で次を実行すると、

./run-as-cron ./cron-env 'docker exec -it test ls'

次のようにエラーになります。cron環境では、入力用の端末TTYが指定されていないので、キー入力をともなうコマンドが失敗します。この場合は、dockerのオプション -i でキー入力を行う指定がされていることが原因です。
これも、cron実行時に起こるエラーを事前に確認できます。

the input device is not a TTY

コメント