-1

cronジョブを使用したいのですが、3日に1回、メールログをクリーンアップして並べ替えます。

私の仕事は

 /bin/sed -i /status=/!d /var/log/maillog | 
    (/bin/grep "status=bounced" /var/log/maillog | /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" | /bin/sort -u >> /root/unsent.log) | 
    (/bin/grep "status=deferred" /var/log/maillog | /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" | /bin/sort -u >> /root/deferred.log) | 
    (/bin/grep "status=sent" /var/log/maillog | /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" | /bin/sort -u >> /root/sent.log) | 
/bin/sed -i "/status=/d" /var/log/maillog

ジョブは正常に機能し、3つのステップを実行します。

  1. 「status=」を含まないすべての行をメールログから削除します
  2. 送信、バウンス、遅延をさまざまなログで並べ替えます。
  3. 「ステータス」を含むすべての行をメールログから削除します

この仕事の後、私のメールログは完全にきれいになり、3つのログにソートされます。

しかし、Postfixは次のレコードをメールログに書き込みたくありません。

sedコマンドを削除すると、Postfixは次のレコードを正常に書き込みます。

cronジョブの実行後にsedコマンドがメールログをブロックするのはなぜですか?

4

2 に答える 2

1

sed -i変更するファイルのリンクを解除するため、syslog/postfix は存在しないファイルへの書き込みを続行します。

http://en.wikipedia.org/wiki/Sedから:

注:「sed -i」は元のファイルを新しいファイルで上書きし、元のファイルにあった可能性のあるリンクをすべて壊します

syslog が中断せずに書き込みを続行できるように、logrotateや などのツールを使用してログ ファイルをローテーションした後に処理する方が一般的です。savelog

その場で編集する必要がある場合/var/log/maillogは、cron ジョブの最後に行を追加して、完了時に syslog をリロードできます。これを行うと、スクリプトの実行中にファイルに書き込まれたログ行が失われる可能性があることに注意してください。コマンドは、実行しているディストリビューション/オペレーティング システムによって異なります。rsyslog を使用する ubuntu では、reload rsyslog >/dev/null 2>&1.

于 2012-04-05T10:33:20.457 に答える
0

元のコードを再フォーマットして、追加したパイプラインを強調表示しました

 /bin/sed -i /status=/!d /var/log/maillog \
 | (/bin/grep "status=bounced" /var/log/maillog \
     | /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
     | /bin/sort -u >> /root/unsent.log\
   ) \
 | (/bin/grep "status=deferred" /var/log/maillog \
   | /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
   | /bin/sort -u >> /root/deferred.log\
   ) \
 | (/bin/grep "status=sent" /var/log/maillog \
   | /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
   | /bin/sort -u >> /root/sent.log \
   ) \
 | /bin/sed -i "/status=/d" /var/log/maillog

@alberge が指摘したように、このすべてのsed -i処理が同じファイルで行われると、ログ メッセージが失われる可能性が非常に高くなります。

別のアプローチを提案します。

メールログを日付付きのファイル名に移動します (ここでの仮定は、Postfix が使用するのが「好きな」標準名 (/var/log/maillog) で新しいファイルを作成することです)。

次に、実際の目標は、さまざまなカテゴリのメッセージを個別に名前を付けたファイル、つまり unsent.log、deferred.log、sent.log に抽出することであり、文字列を含まない行を破棄することですstatus=(ただし、そうします)最初)。

これが私の代替案です(メッセージ全体を読んでください。すぐにコピー/貼り付け/実行しないでください!)。

 logDate=$(/bin/date +%Y%m%d.%H%M%S)
 /bin/mv /var/log/maillog /var/log/maillog.${logDate}

 /bin/grep "status=bounced" /var/log/maillog.${logDate} \
 | /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
 | /bin/sort -u \
 >> /root/unsent.log.${logDate} 

 /bin/grep "status=deferred" /var/log/maillog.${logDate} \
 | /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
 | /bin/sort -u \
 >> /root/deferred.log.${logDate}

/bin/grep "status=sent" \
| /bin/grep -E -o --color "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" \
| /bin/sort -u \
>> /root/sent.log.${logDate} 

このコードが機能していることをテストするには、2 行目 ( /bin/mv ....) を次のように置き換えます。

  /bin/cp /var/log/maillog /var/log/maillog.${logDate}

それをターミナル ウィンドウに/var/log/maillog.${logDate}コピー アンド ペーストし、正しくコピーされたことを確認してから、各セクションを一度に 1 つずつコピー アンド ペーストし、期待される出力が各/rootログ ファイルに作成されていることを確認します。

(これらのブロックのいずれかでエラー メッセージが表示された場合は、継続する各行の最後の '\' 文字の後にスペース/タブ文字がないことを確認してください。または、これら 3 つのパイプラインのそれぞれを 1 行に折りたたんで、あなたが行くように「\」文字。

(各ログファイルを作成するために、/rootサブプロセスで囲まれたパイプを介して接続セクションを使用しないことに注意してください。しかし、他の状況では、高度な問題に対してこの種の手法を使用するため、手法をスローしないでください本当に必要なときにだけ使用してください;-)!

これらすべてが必要に応じて機能していることを確認したら、スクリプトを拡張して最終的なクリーンアップを行います。

/bin/rm  /var/log/maillog.${logDate}

${logDate}各出力ファイルに追加しましたが、使用しsort -u >>ているように、サブログファイル名 (unsent.log、deferred.log、sent.log) の「拡張子」を削除することをお勧めします。これらのファイルは自然に大きくなります。どちらの場合も、ある時点で戻ってきて、このデータをどれくらい前に保持したいかを決定し、これらのログファイルが役に立たないときにどのようにクリーンアップするかについて計画と方法を開発する必要があります。logrotate誰かがパッケージについて言及したと思います。長期的な解決策として、それを検討することをお勧めします。


このソリューションにより、多くの余分なプロセスが作成されることが回避され、ログ レコードが失われる可能性が (ほとんど) なくなります。ファイルを移動しているのと同じ一瞬で Postfix がログファイルに書き込んでいると、レコードの全部または一部が失われる可能性があると思います。しかし、あなたのソリューションには、同様の問題があり、それが発生する可能性が高くなります。

( .... ) | ( .... )ネストされたサブプロセスを使用して、設計の意図を誤解した場合は、申し訳ありません! 投稿を更新して、その手法を使用する理由を含めることを検討してください。

これが役立つことを願っています。

于 2012-04-06T04:52:04.897 に答える