web-dev-qa-db-ja.com

/ dev / null /へのcronjobを完全に無音にする方法は?

私のUbuntu-Desktopと私のdebian-serverには、毎分実行する必要のあるスクリプト(私の space online browsergame のminute-ticを呼び出すスクリプト)があります。

問題は、debian派生物で、cronが実行されるたびに/var/log/syslogにログを記録することです。 /var/log/syslogで何度も実行されたメッセージが繰り返し表示されるようになります。

Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)

プログラムの出力を抑制するために、それを/dev/nullにリダイレクトできることを知っています。たとえば、プログラムからすべてのエラーおよび警告メッセージを非表示にするには、次のようにcrontabに行を作成します

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

しかし、私はcronjobを実行して、生成されたすべての出力またはエラーがNULLにパイプ処理されるようにしたいので、syslogにメッセージが生成されず、電子メールが生成されません。


編集:
cron_logsを別のログにリダイレクトするソリューションがあります ここで提案されているように/etc/syslog.confを変更して

ただし、欠点は、すべてのcronjobsのすべての出力がリダイレクトされることです。

どういうわけか、単一のcronジョブのみを別のログファイルにリダイレクトできますか?できれば、cron.hourlyファイル自体の内部で構成可能です。

78
rubo77

これを行にしてください:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

これにより、STDOUT(1)とSTDERR(2)の両方がキャプチャされ、/dev/nullに送信されます。

メール

また、MAILTO=""を設定してリセットすることでメールを無効にすることもできます。これにより、メールの送信が無効になります。

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="[email protected]"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

追加のメッセージ

多くの場合、/var/log/syslogには次のタイプのメッセージが表示されます。

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

これらは、cronジョブのディレクトリが実行されたことをcron経由で通知するだけです。このメッセージは、これらのジョブに直接関係するものではなく、crondデーモンから直接送信されます。これらについて実際にできることは何もありません。ログを介してcrondを実行するための唯一のウィンドウであるため、これらを無効にしないことをお勧めします。

それらが非常に煩わしい場合は、いつでも/var/log/syslog構成ファイルsyslogを使用して、/etc/syslog.confファイルから取得するために、それらを代替ログファイルに転送できます。

125
slm

毎分実行する必要があるスクリプトがあります。問題は、cronが実行されるたびに/ var/log/syslogにログを記録することです。/var/log/syslogに繰り返し実行されたメッセージが繰り返し表示される

あなたがすることはこれを止めるようには見えないので、質問する価値があります:このスクリプトはexactlyであり、exactlysyslogに表示されるメッセージですか?

Slmの提案が機能しなかった場合、これは何かが直接syslogにログを記録しているためです-いくつかのコメントで暗示されているように見えるcron、またはcronによって実行されるプロセスsyslogに送信されるメッセージはstdinまたはstderrから送信されないため、2>&1&>は役に立ちません。

問題のアプリケーションの動作を構成する方法があるかもしれませんが、それが何であるかはわかりません。

メッセージを非常に具体的にフィルタリングするために、最新のsyslog実装(いくつかあります)を構成する方法は確かにあります。たとえば、ログメッセージで使用される一意のタグがある場合、それをターゲットにできます。しかし、繰り返しになりますが、特定のメッセージや使用するsyslogdについては何もわからないため、推奨できる具体的なものはありません。

私の一般的なポイントは、「これによりすべてのメッセージがリダイレクトされる」ためにメッセージをリダイレクト/フィルタリングしたくない場合、フィルタリング技術を調整できます言及しただけにリンクしたサーバー障害スレッド施設によるフィルタリング(*.cron)-しかしより専門的なフィルターを設定できますそれ以上。


DebianとUbuntuはどちらもrsyslogを利用できます。 debian 5+では、これがデフォルトのsyslogですが、ubuntuではオプションなので、インストールする必要があります。特定の種類のコンテンツをターゲットとするフィルターを作成するには、これをtopの近くに配置します(つまり、他のルールの前、ただし一般的な構成の後に、モジュール読み込み中など)/etc/rsyslog.conf。これを行う最良の方法は、rsyslog.conf自体を編集するのではなく、/etc/rsyslog.conf.d/ディレクトリに、50未満の2桁で始まる名前のファイル、つまり/etc/rsyslog.conf.d/15-my-filter.confを作成することです。あなたはこのようなものをそこに置くことができます:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

これにより、メッセージが/dev/null(または、必要に応じて別のログ)に送信されます。ただし、メッセージは/var/log/syslogに送信する後続のルールを通過します。それを防ぐには:

& stop

その別の行の直後。これにより、前のルールに一致したものはすべて破棄されます。または、単一行ルールの場合、そのルール行の最後にstopを追加するだけで済みます。

設定を変更した後、rsyslogdを再起動する必要があります(たとえば、systemdシステムではsystemctl restart rsyslog):

kill -HUP $(cat /var/run/rsyslogd.pid)

HUPにより、デーモンは自動的に再起動します。

10
goldilocks

変化する /etc/default/cron

# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"

デフォルトではEXTRA_OPTS行は""

5
Dallas

/dev/nullにリダイレクトすると、コマンドからの出力が非表示になります。これを行わない場合、cronは出力をメールで送信します。コマンドの出力がシステムログに記録されることはありません(少なくともcronが実行することはありません)。

通常、出力を/dev/null、特にエラー出力にリダイレクトすることはお勧めできません。問題が発生した場合、問題を診断するための情報がありません。メールを受信したくない場合は、ログファイルにリダイレクトします。

ただし、これは問題に関係ありません。あなたが引用するメッセージはcron自体からのものです。 Cronは、ジョブを実行するたびにログエントリを書き込みます。私が見たcron実装では、さまざまなジョブにさまざまなロギング構成を使用できます。

一部のジョブを省略したい場合、唯一のオプションは、syslogデーモンのログメッセージにテキストフィルタリングを適用することです。 syslogフィルタリングの事実上の標準は、syslogデーモンとして rsyslog (システムのデフォルトであるかどうかにかかわらず)を実行することです。この特定のコマンドを除外する方法については、 goldilocksの回答 を参照してください。