Ich versuche, ein System zu entwickeln, das eingehende E-Mail-Nachrichten von einem Syslog-Server filtern kann. Wenn es sich um Duplikate zu handeln scheint, müssen sie gelöscht werden (drosseln). Procmail leitet sie zur Verarbeitung an ein Perl-Skript weiter. Das funktioniert alles, außer wenn ich eine Flut von E-Mails auf einmal bekomme. Dann scheint Postfix mehrere Instanzen des weitergeleiteten Skripts zu erzeugen. Natürlich ist das in den meisten Fällen wünschenswert, aber für dieses Projekt muss ich in der Lage sein, die eingehenden Nachrichten einzeln zu verarbeiten, damit ein Datenbankfeld mit einem Zeitstempel aktualisiert werden kann, damit nachfolgende Nachrichten, die einem Kriterium entsprechen, gelöscht und nicht an die Empfänger weitergeleitet werden können. **Gibt es eine Möglichkeit, diese eingehenden Nachrichten in eine „Warteschlange“ zu stellen, damit sie einzeln und nicht parallel verarbeitet werden? Danke.
Antwort1
Sie können die Sperre von procmail verwenden, um mehrere Instanzen gleichzeitig eine Instanz des Perl-Skripts ausführen zu lassen. Siehe man procmailrc
undman procmailex
:0 w: script.lock
| /.../script.pl
Natürlich gibt es auch andere MöglichkeitenAberWie viele Nachrichten werden Sie voraussichtlich in der Spitzen- und Durchschnittsstunde pro Stunde verarbeiten?
Antwort2
Als Ergänzung zur Lösung von Andrzej können Sie bei Bedarf mit der LOCKFILE
speziellen Variable eine Sperre für einen größeren Bereich als nur ein einzelnes Rezept festlegen.
# 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=
Im Prinzip könnten Sie mehrere kritische Abschnitte haben, die durch die gleiche Sperrdatei geschützt werden, mir fällt allerdings kaum ein Szenario ein, in dem dies tatsächlich sinnvoll wäre.