syslog 서버에서 들어오는 이메일 메시지를 필터링할 수 있는 시스템을 설계하려고 합니다. 중복된 것으로 보이면 삭제해야 합니다(제한). Procmail은 처리를 위해 이를 Perl 스크립트로 파이프합니다. 한꺼번에 많은 이메일을 받는 경우를 제외하고는 모두 작동합니다. postfix는 파이프 스크립트의 여러 인스턴스를 생성하는 것 같습니다. 분명히 이는 대부분의 경우에 바람직하지만 이 프로젝트에서는 들어오는 메시지를 한 번에 하나씩 처리할 수 있어야 데이터베이스 필드가 타임스탬프로 업데이트되어 기준과 일치하는 후속 메시지가 대신 삭제될 수 있습니다. 수신자에게 전달됩니다. **이러한 수신 메시지를 병렬이 아닌 한 번에 하나씩 처리하도록 "대기열"에 넣는 방법이 있습니까? 감사해요.
답변1
procmail의 잠금을 사용하여 여러 인스턴스가 주어진 시간에 Perl 스크립트의 한 인스턴스를 실행하도록 할 수 있습니다. 참조 man procmailrc
및man procmailex
:0 w: script.lock
| /.../script.pl
아 물론 다른 방법도 있어요하지만피크 시간과 평균 시간에 처리할 시간당 메시지 수는 몇 개입니까?
답변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=
원칙적으로 동일한 잠금 파일로 보호되는 여러 중요 섹션을 가질 수 있지만 이것이 실제로 유용한 시나리오는 생각하기 어렵습니다.