各実行でcronジョブが何をしているのかを正確に確認する方法を知りたいです。ログファイルはどこにありますか。それとも、私のメールに出力を送ることができますか? cronジョブの実行時にログを送信するようにEメールアドレスを設定しましたが、まだ何も受け取っていません。
* * * * * myjob.sh >> /var/log/myjob.log 2>&1
cronジョブからのすべての出力を/var/log/myjob.logに記録します。
あなたはEメールを送るのにmail
を使うかもしれません。ほとんどのシステムは、未処理のcron
ジョブ出力をEメールでrootまたは対応するユーザーに送信します。
デフォルトでは、cronは/ var/log/syslogにログを記録するので、次のコマンドを使用してcron関連のエントリを確認できます。
grep CRON /var/log/syslog
https://askubuntu.com/questions/56683/where-is-the-the-cron-crontab-log
ロギングには少なくとも3つの異なるタイプがあります。
プログラムの実行前のロギングが実行されます。これは、cronjobがコマンドを実行するために試行した場合にのみログに記録します。 @Matthew Lockで既に述べたように、このファイルは/ var/log/syslogにあります。
プログラムが実行しようとした後のエラーのログ記録。@Spliffsterが述べたように、これはEメールまたはファイルに送信される可能性があります。私はファイルにログを記録することを好む、なぜなら電子メールであなたには新しい問題の原因があり、電子メールの送信と受信が完全に機能しているかどうかのチェックだ。時々それはそうです、時々それはそうではありません。たとえば、smtpの設定に興味がない単純な一般的なデスクトップマシンでは、ファイルへのロギングを好むことがあります。
* * * * COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
Cronjobには、いくつかの一般的な問題の原因があります。*実行されるバイナリの絶対パス。シェルから実行するとうまくいくかもしれませんが、cronプロセスは別の環境を使用しているように見えるため、絶対パスを使用しない場合は必ずしもバイナリを見つけることができません。 *バイナリで使用されているライブラリ。これはほぼ同じ点ですが、単にコマンドのNAMEを入力する場合は、まったく同じライブラリを使用するバイナリを参照していることを確認してください。絶対パスで参照しているバイナリを確認してください。コンソールを直接使用するときに参照するものとまったく同じです。バイナリはlocateコマンドを使って見つけることができます。例えば:
$locate python
参照するバイナリがシェルで呼び出しているバイナリとまったく同じであることを確認するか、cronjobに配置する予定の絶対パスを使用してシェルで再度テストします。
これが私のコードです:
* * * * * your_script_fullpath >> your_log_path 2>&1
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 /
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では、warn
とdie
は標準エラー出力に出力されます。 Pythonでは、sys.stderr
に書き込むか、logging
を使用します。 Rubyでは$stderr.puts
を試してください。診断メッセージを生成したスクリプトの名前をエラーメッセージに含める方法も注目してください。
Sudoでコマンドを実行しているとしたら、それはできません。 Sudoにはttyが必要です。
それでもcronジョブを確認したい場合は、cPanelでCronジョブを設定するときに有効な電子メールアカウントを入力する必要があります。
有効なEメールを指定すると、実行されたcronジョブの出力を受け取ります。したがって、あなたはそれをチェックして、すべてが正しく実行されたことを確かめることができるでしょう。 cron jobコマンドからの出力がない場合は、Eメールを受信しません。
実行された各cronジョブについてEメールが送信されます。あなたのcronsがあまりにも頻繁に動く場合、これはあなたの受信箱をあふれさせるかもしれません