cronジョブの結果を表示するにはどうすればよいですか?


回答:


66

cronで実行するプログラムに独自のログファイルがあるかどうかを確認します。それらが出力を標準出力に書き込めない場合は、これらをファイルにリダイレクトしたり、メールで送信したりできます。crontab内では、標準のシェルリダイレクトが機能します。

例えばのエラー出力にリダイレクトするsome_job.shにはsome_job.err、標準出力(すなわちに送信を捨て/dev/null、あなたのcrontabに以下のリダイレクトを追加します)

 33 3 * * * /path/to/some_job.sh 1> /dev/null 2> /other/path/to/some_job.err

または、代わりにそれを郵送します(mail利用可能な場合)

 33 3 * * * /path/to/some_job.sh 1> /dev/null 2>&1 | mail -s "cron output" you@example.org

これが、私がいつもcronの問題を解決してきた方法です。
物理マイケル

2番目の例は正しいですか?すべてにリダイレクトしません/dev/nullか?
Timmmm

7
@Timmmm:私は仕事をしています。最初に、すべてをsome_job.shstdoutから/dev/nullstderrの後にstdoutにリダイレクトします(stdoutには何も含まれなくなりました)。そのようにして、標準エラーのみが標準出力になり、に渡されmailます。
ベンジャミンバニエ

9

私が使用したプラットフォーム上のほとんどのcronデーモンは、croncronジョブのstdout / stderrを、ジョブのcrontabが由来するユーザーに自動的にメールで送信します。システム全体(/ etc / crontabからのユーザー固有ではないcronジョブ)に何が起こるか忘れています。問題は、ほとんどのUnixライクなOSで、メーラーデーモン(つまり、sendmail、qmail、またはpostfixなどのMail Transfer Agent(MTA))が常に設定されないことです。そのため、cronジョブの出力電子メールは、そこまで到達した場合でも、どこかのローカルメールスプールフォルダーで死にます。したがって、1つの答えは、メーラーデーモンを起動することであり、ローカルメールを「実際の」メールアカウントに転送する〜/ .forwardファイルがあることを確認することです。

特定のログファイルにジョブを書き込む場合は、@ honkのような標準出力リダイレクトを使用できます。または、cronジョブがシェルスクリプトであると仮定すると、スクリプトでlogger(1)またはsyslog(1)を呼び出すことができます。 OSがsyslogに任意のメッセージを送信するために提供する他のコマンドラインツール。次に、おそらく/etc/syslog.confを編集して、OSに組み込まれている方法を使用して、どの種類のメッセージをどこに記録するかを構成できます。

私のcronジョブのほとんどは、特定の理由でcronによって開始されることを目的に作成したbashスクリプトを呼び出します。特に、最初にそれらを作成してデバッグするときは、bashの「set -vx」を使用して、シェルスクリプトの各行の展開されていない形式を実行前にstdoutに書き込みます。cronから開始されたシェルスクリプトは、非ログイン、非対話型シェルと見なされるため、.bashrcや.profileなどの標準シェルスタートアップスクリプトは実行されないことに注意してください。bashを使用していて、bashで起動スクリプトを実行する場合、ジョブを定義する行の前に、crontabで環境変数「BASH_ENV = / path / to / my / startup / script」を定義する必要があります。


3
これは正しいです。mailコマンドを使用して、コマンドラインからメッセージを読み取ることができます。またはを見てください/var/spool/mail。ただし、標準のsendmail以外のpostfixまたは他のメーラーをインストールしている場合は、メッセージを読むための別の方法が必要です。
アコスタディノフ

なぜこれだけのためにメールサービスエージェントが必要なのですか?mail -s "cron output" test@example.comうまく動作します:/
Martin Konecny

CentOSでは、cron出力は/ var / spool / mailに「メール送信」されます。実行することによって、それを参照してくださいless $MAILあなたは、現在のユーザーのためか、cronの出力を確認したい場合less /var/spool/mail/rootは、rootとして実行しているコマンドのcronの出力を確認したい場合。
sffc


2

最も簡単な方法は、印刷エラーをキャプチャし、ファイルに保存することです。次のように、phpコマンドラインを呼び出すcronjobがあります。

1 0 * * * php /pathOfMyApp/index.php controllerName functionName> / pathOfMyApp / log / myErrorLog 2>&1

「>」の前の部分は私のcronjobで、「>」の後の部分はキャプチャであり、プロジェクトのルートにあるログフォルダーにあるファイルに保存しますが、必要な場所に配置できます。注意してください:cronjobが呼び出されるたびに、最後のログが上書きされます。「>>」を使用して、既存のファイルの最後に書き込むか、「cat」端末コマンドを検索できます。

crontabが 'curl'または 'wget'を使用してリンクを参照している場合、cronが500または400で返されている場合は、/ var / log / httpd / appNameでaccess-logを検索できます。

最後に、/ var / log / messagesも確認できます。


1

この場合、cronファイル内でのリダイレクトは最良の選択肢ではないかもしれません。

多くの場合、ログの指定はcronジョブスクリプトと同じ場所に配置します。この場合、次のことをお勧めします。

#!/bin/bash
exec &>> capture-log.txt
echo "Running cron-job foo at $(date)"
...
<rest of script>

これにより、cronジョブからの出力がcapture-log.txtファイルに追加されます。


1

cronジョブに関する電子メールレポートを取得することを好みます。置くだけ

MAILTO=yourmail@domain.com

crontabに移動すると、メールが届きます。もちろん、アカウント用に電子メールを設定する必要があります。


多くの場合、これはデバッグのためにオン/オフするのが最も簡単だと思います。通常、メールアドレスにはusername @ localhostを使用します。
フリッカーフライ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.