web-dev-qa-db-ja.com

crontabジョブのデバッグ

Java実行可能ファイル。Javaコードは、エラーとメッセージをログに記録するために独自のクラスを使用します。ファイル。

しかし、スケジュールされた時間の後にログファイルをチェックしたとき、メッセージは記録されませんでした。実行が開始されたことを示す少なくとも1つのログメッセージがあるはずです。

そのため、2つの原因が考えられます。

  1. コードは実行されましたが、ログに記録されませんでした。
  2. または、コードがまったく実行されませんでした。

指定されたログファイルにはchmod 777パーミッションなので、ここでの2番目の原因だと思います。

Crontabジョブがスケジュールされた時間に実行されないのはなぜですか?そして、どのようなロギングも行わずにこれをどのようにデバッグしますか?

エラーがある場合、cronがユーザーにメールを送信することを読みました。ユーザーに関連付けられているメールアドレスを確認するにはどうすればよいですか?

47
naiquevin

問題を追跡するために、cronジョブのログを有効にすることができます。 /etc/rsyslog.conf or /etc/rsyslog.d/50-default.conf(Ubuntuで)ファイルを編集し、次の行のコメントを外すか、行がない場合は追加する必要があります。

cron.*                         /var/log/cron.log

次に、rsyslogcronを再起動します。

Sudo service rsyslog restart
Sudo service cron restart

Cronジョブは/var/log/cron.logにログを記録します。

68
Mehdi Yedes

Crontabコマンドの末尾に2>&1を追加します。これにより、stderr出力がstdoutにリダイレクトされます。次に、crontabのUnixコマンドを記録していることを確認します。

0 0,12 1 */2 * /sbin/ping -c 192.168.0.1; ls -la >>/var/log/cronrun 2>&1

これにより、Unixコマンドからすべてがキャプチャされます。

いくつかの追加のヒント(先日同僚を助けた後...)。パラメーターなしでコマンドセットを発行して、環境変数を書き出します。そして、シェルにset -xコマンドを使用して各コマンドをエコーさせます。スクリプトの問題の先頭。

set
set -x
34
Karl

コマンドを手動で実行してもCronでは実行できないと仮定すると、cronコマンドに正しいパスが公開されていない可能性があります。これを修正するには、crontab -eを実行し、cronタブに直接パスを入力します。

# Export the path so that the scripts run correctly PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

2
user189271

問題を引き起こしている可能性のあることの1つは、cron(少なくとも私が使用しているディストリビューション、Amazon Linux OS)は時刻がUTCであると見なすことです。したがって、異なるタイムゾーン(たとえば-03: 00)実際に問題が発生することはなく、実際には問題がないことを3時間前に実行すると予想される場合があります。

1
Renato Gama

うまく動作する必要がある時間を本当にフォーマットしたかどうかを確認します。

たとえば

*/1 * * * * echo 'debug' > /home/glab/change_branch.log

これかもしれません:

1 * * * * echo 'debug' > /home/glab/change_branch.log

そして、あなたはそれが毎分実行されると期待しているかもしれません。また、ログも生成されません。

0
Darius.V