web-dev-qa-db-ja.com

cronジョブを記録する方法

各実行でcronジョブが何をしているのかを正確に確認する方法を知りたいです。ログファイルはどこにありますか。それとも、私のメールに出力を送ることができますか? cronジョブの実行時にログを送信するようにEメールアドレスを設定しましたが、まだ何も受け取っていません。

188
Adrian M.
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

cronジョブからのすべての出力を/var/log/myjob.logに記録します。

あなたはEメールを送るのにmailを使うかもしれません。ほとんどのシステムは、未処理のcronジョブ出力をEメールでrootまたは対応するユーザーに送信します。

297
Spliffster

デフォルトでは、cronは/ var/log/syslogにログを記録するので、次のコマンドを使用してcron関連のエントリを確認できます。

grep CRON /var/log/syslog

https://askubuntu.com/questions/56683/where-is-the-the-cron-crontab-log

56
Matthew Lock

ロギングには少なくとも3つの異なるタイプがあります。

  1. プログラムの実行前のロギングが実行されます。これは、cronjobがコマンドを実行するために試行した場合にのみログに記録します。 @Matthew Lockで既に述べたように、このファイルは/ var/log/syslogにあります。

  2. プログラムが実行しようとした後のエラーのログ記録。@Spliffsterが述べたように、これはEメールまたはファイルに送信される可能性があります。私はファイルにログを記録することを好む、なぜなら電子メールであなたには新しい問題の原因があり、電子メールの送信と受信が完全に機能しているかどうかのチェックだ。時々それはそうです、時々それはそうではありません。たとえば、smtpの設定に興味がない単純な一般的なデスクトップマシンでは、ファイルへのロギングを好むことがあります。

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • また、/ ABSOLUTE_PATH_TO_LOGの権限を確認し、そのユーザーの権限からコマンドを実行します。確認のためだけに、潜在的な問題の原因となる可能性があるかどうかをテストします。
  3. プログラム自体のログ記録。追跡を目的とした独自のエラー処理およびログ記録。

Cronjobには、いくつかの一般的な問題の原因があります。*実行されるバイナリの絶対パス。シェルから実行するとうまくいくかもしれませんが、cronプロセスは別の環境を使用しているように見えるため、絶対パスを使用しない場合は必ずしもバイナリを見つけることができません。 *バイナリで使用されているライブラリ。これはほぼ同じ点ですが、単にコマンドのNAMEを入力する場合は、まったく同じライブラリを使用するバイナリを参照していることを確認してください。絶対パスで参照しているバイナリを確認してください。コンソールを直接使用するときに参照するものとまったく同じです。バイナリはlocateコマンドを使って見つけることができます。例えば:

$locate python

参照するバイナリがシェルで呼び出しているバイナリとまったく同じであることを確認するか、cronjobに配置する予定の絶対パスを使用してシェルで再度テストします。

  • 問題のもう1つの一般的な原因はcronjobの構文です。リスト(カンマ)、範囲の定義(ダッシュ - )、範囲の増分(スラッシュ)などに使用できる特殊文字があることを忘れないでください。 http://www.softpanorama)。 org/Utilities/cron.shtml
10
David L

これが私のコードです:

* * * * * your_script_fullpath >> your_log_path 2>&1
10
Haimei

Ubuntuでは、cron.logファイルにCRONエントリだけを含めることができます。

/etc/rsyslog.d/50-default.confファイルのcronについて言及している行のコメントを外します。

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

ファイルを保存して閉じ、rsyslogサービスを再起動します。

Sudo systemctl restart rsyslog

これで、cronのログエントリが独自のファイルに表示されます。

Sudo tail -f /var/log/cron.log

出力例:

Jul 18 07:05:01 machine-Host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

ただし、実際にどのスクリプトが/etc/cron.dailyまたは/etc/cron.hourly内で実行されたかについての詳細は、これらのスクリプトがcron.log(またはおそらく他のログファイル)に出力を指示しない限り表示されません。

Crontabが実行中であり、cron.logまたはsyslogで検索する必要がないかどうかを確認したい場合は、出力を任意のログファイルにリダイレクトするcrontabを作成します。

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

手順: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu) -linux /

5
Gianfranco P.

cronは、実行したすべてのジョブの標準出力と標準エラーをすでにcronジョブの所有者にメールで送信しています。

crontabファイルでMAILTO=recipientを使用して、Eメールを別のアカウントに送信させることができます。

これが機能するには、メールが正しく機能している必要があります。ローカルのメールボックスへの配送は通常は問題ではありません(実際にはls -l "$MAIL"は既に受け取っていることを明らかにするでしょう)が、それを箱から出してインターネットに出すにはMTAが必要です(Postfix、Sendmail、何があります)。世界に接続するように正しく設定されていること。

出力がない場合、Eメールは生成されません。

一般的な方法は、出力をファイルにリダイレクトすることです。その場合、もちろんcronデーモンはジョブから出力が返されることはありません。 1つの方法は、標準出力をファイルにリダイレクトする(あるいは何も印刷しないようにスクリプトを作成する - 代わりにデータベースに結果を保存する、あるいは何も出力しないメンテナンス作業を実行するなど)ことです。エラーメッセージです。

両方の出力ストリームをリダイレクトするための構文は次のとおりです。

42 17 * * * script >>stdout.log 2>>stderr.log

上書きの代わりに(double >>)を追加して、前のジョブの出力が次のジョブの出力に置き換えられないようにします。

ここで多くの回答で示唆されているように、両方の出力ストリームを単一のファイルに送信することができます。 2番目のリダイレクトを2>&1に置き換えて、「標準エラー出力は標準出力になっても問題ありません」と書きます。 (しかし、このやり方を特に支持するものではありません。標準出力に何も期待していなくても、スクリプトから呼び出された外部ツールから何かを見落としているかもしれません。)

cronジョブはホームディレクトリで実行されるため、相対ファイル名はすべてそれに対して相対的である必要があります。ホームディレクトリの外に書き込みたい場合は、その宛先ファイルに書き込み権限があることを確認する必要があります。

一般的なアンチパターンは、すべてを/dev/nullにリダイレクトすることです(そして、何かがうまくいかないときに何が悪かったのかを理解するためにStack Overflowに依頼します。しかし、失われた出力も見えません)。

スクリプトの中から、定期的な出力(実際の結果、理想的には機械可読形式)と診断(通常は人間が読む人のためにフォーマットされた)を別々にしてください。シェルスクリプトでは、

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2

いくつかのプラットフォーム(そして例えばGNU Awk)はエラーメッセージのためにファイル名/dev/stderrを使うことを可能にします、しかしこれは適切に移植可能ではありません。 Perlでは、warndieは標準エラー出力に出力されます。 Pythonでは、sys.stderrに書き込むか、loggingを使用します。 Rubyでは$stderr.putsを試してください。診断メッセージを生成したスクリプトの名前をエラーメッセージに含める方法も注目してください。

4
tripleee

Sudoでコマンドを実行しているとしたら、それはできません。 Sudoにはttyが必要です。

1
Saad Masood

それでもcronジョブを確認したい場合は、cPanelでCronジョブを設定するときに有効な電子メールアカウントを入力する必要があります。

有効なEメールを指定すると、実行されたcronジョブの出力を受け取ります。したがって、あなたはそれをチェックして、すべてが正しく実行されたことを確かめることができるでしょう。 cron jobコマンドからの出力がない場合は、Eメールを受信しません。

実行された各cronジョブについてEメールが送信されます。あなたのcronsがあまりにも頻繁に動く場合、これはあなたの受信箱をあふれさせるかもしれません

0
Faridul Khan