1. 概要

cronジョブは、通常のシェルとは異なる環境で実行されます。これは、あらゆる種類のエラーやフラストレーションの原因となる可能性があります。

このチュートリアルでは、作成したcronジョブのデバッグを容易にするために実行できるいくつかの対策を見ていきましょう。

この記事に記載されているすべてのコマンドはPOSIXコマンドであり、Bashでテストされています。 これらは、すべてのPOSIX互換シェルで使用できる必要があります。

2. チャレンジ

cronジョブのテストとデバッグを困難にする問題は、それらが私たちの環境とは異なる環境で実行されることです。 これに対処するには、これらの違いをよく理解する必要があります。

2.1. ユーザー

これらのディレクトリにあるcronジョブは、rootとして実行されます。

/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/

それらをcronテーブル、または略してcrontabに配置することもできます。 各ユーザーには独自のcrontabがあります。 crontabで定義されたすべてのジョブは、それを所有するユーザーとして実行されます。

これらのジョブの作成を成功させるには、cronデーモンが使用するのと同じユーザーとして作成してテストする必要があります

式の構文をチェックするため、常にcrontabコマンドを使用してcrontabを編集する必要があります。

2.2. 環境

cronジョブは、ほとんど空の環境で実行されます。 デーモンは、いくつかの変数と、 / usr / bin:/binのみを含む最小のPATHを設定します。

HOMEおよびPATHの内容に依存せずに、常にcronジョブで絶対パスを使用するか、スクリプトでPATHを明示的に定義する必要があります。

3. ロギング

システムで実行されているほとんどのデーモンと同様に、cronデーモンはその出力を / var /logの下のどこかに記録します。 これらのログをチェックして、ジョブが適切なタイミングで実行されるかどうかを確認します。

最も人気のあるcronの実装は、 Vixiecronです。 Vixiecronログは/var / log /cronに移動します。 これらのログには、ジョブがいつ実行されたかが表示されますが、ジョブの実行中にエラーが発生したかどうかはわかりません。

さらに、スクリプトにロギングを追加することをお勧めします。 これは、問題が発生したときに問題が発生した場所を正確に特定するのに役立ちます。

コマンドprintenvとBash組み込みコマンドsetはこれに最適であることがわかりました。 スクリプトの周りに次の行を配置して、それらを追加します。

printenv
set -x

... our script goes here ...

set +x

printenv コマンドは、すべての環境変数を標準出力に出力します。

set -x を使用して、実行されたすべてのコマンドが標準出力にも出力されるモードにシェルを配置します。 最後に、スクリプトの最後で、 set +xを使用してこのデバッグモードをオフにします。

4. 早く失敗する

それに関しては、本物ほど良くなるものはありません。 cronデーモンが行うすべてのことを模倣できますが、ジョブ自体を実行することによってのみ、ジョブが期待どおりに機能することを確認できます。

cron式を近い将来に設定し、すべてをファイルに記録することができます。

42 20 * * * /path/to/cronjob.sh > /tmp/cronjob.log 2>&1

スクリプトは20:42に実行されます。 を使用して標準エラーを標準出力にリダイレクトすることにより、すべてをログファイルにキャプチャします 2>&1

5. 結論

この記事では、cronジョブをテストする方法を学びました。 それらは限られた環境で実行され、どのように対処できるかを学びました。

また、デバッグを容易にするロギングを追加することにより、いくつかの追加の対策を講じました。