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
コメント