私の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
ファイル自体の内部で構成可能です。
これを行にしてください:
* * * * * 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
ファイルから取得するために、それらを代替ログファイルに転送できます。
毎分実行する必要があるスクリプトがあります。問題は、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により、デーモンは自動的に再起動します。
変化する /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
行は""
/dev/null
にリダイレクトすると、コマンドからの出力が非表示になります。これを行わない場合、cronは出力をメールで送信します。コマンドの出力がシステムログに記録されることはありません(少なくともcronが実行することはありません)。
通常、出力を/dev/null
、特にエラー出力にリダイレクトすることはお勧めできません。問題が発生した場合、問題を診断するための情報がありません。メールを受信したくない場合は、ログファイルにリダイレクトします。
ただし、これは問題に関係ありません。あなたが引用するメッセージはcron自体からのものです。 Cronは、ジョブを実行するたびにログエントリを書き込みます。私が見たcron実装では、さまざまなジョブにさまざまなロギング構成を使用できます。
一部のジョブを省略したい場合、唯一のオプションは、syslogデーモンのログメッセージにテキストフィルタリングを適用することです。 syslogフィルタリングの事実上の標準は、syslogデーモンとして rsyslog (システムのデフォルトであるかどうかにかかわらず)を実行することです。この特定のコマンドを除外する方法については、 goldilocksの回答 を参照してください。