syslog サーバーから受信する電子メール メッセージをフィルターできるシステムを設計しようとしています。重複していると思われる場合は削除する必要があります (スロットル)。Procmail は、それらを処理のために Perl スクリプトにパイプします。すべて正常に動作していますが、一度に大量の電子メールを受信すると、postfix がパイプされたスクリプトの複数のインスタンスを生成するようです。明らかに、ほとんどの場合はこれが望ましいのですが、このプロジェクトでは、データベース フィールドをタイムスタンプで更新して、基準に一致する後続のメッセージを受信者に転送するのではなく削除できるように、受信メッセージを 1 つずつ処理できる必要があります。**これらの受信メッセージを並列ではなく 1 つずつ処理するために「キュー」に入れる方法はありますか? ありがとうございます。
答え1
man procmailrc
procmailのロック機能を使用すると、複数のインスタンスが同時にperlスクリプトの1つのインスタンスを実行することができます。man procmailex
:0 w: script.lock
| /.../script.pl
もちろん他の方法もありますしかしピーク時と平均時に 1 時間あたりに処理するメッセージ数はどれくらいになると予想されますか?
答え2
Andrzej によるソリューションに加えて、特別LOCKFILE
な変数が必要な場合は、単一のレシピだけでなくより広い領域にロックを設定できます。
# Only one instance of Procmail can enter this region
LOCKFILE=.procmail-critical-region.lock
:0
* condition
| action
value=`program`
:0
* another condition
| another action
# We are done now; okay for another instance to enter
LOCKFILE=
原理的には、同じロック ファイルによって保護される複数のクリティカル セクションを持つことができますが、これが実際に役立つシナリオを思いつくのは難しいです。