Исправление проблемы с блокировкой файлов в Procmail

Кто-нибудь видел следующую проблему с таймаутами блокировки файла procmail при записи в файл mbox? Это происходит каждые пару недель для пользователя со следующим procmailrc:

:0 c:     #copy all mail to "bkp"
bkp

В большинстве случаев это работает без проблем. Каждые несколько недель в журнале procmail появляется следующее сообщение:

procmail: Forcing lock on "bkp"
procmail: Timeout, was waiting for "bkp"

Иногда procmail может снять блокировку (или блокировка исчезает) до истечения времени ожидания команды postfix (которое теперь установлено на час). В противном случае доставка почты не удастся:

relay=local, delay=2001, delays=0.78/0.05/0/2000, dsn=5.3.0,
status=bounced (Command time limit exceeded: "procmail -t -f-")

Файл bkp очень большой (более 10 гигабайт), но проблема возникает с перерывами в несколько недель между экземплярами проблемы и не возникает у других пользователей, имеющих файлы одинакового размера procmailrc и гигабайт (хотя ни один из них не такой большой, как этот),

Пользователь предпочел бы не использовать папки в стиле MailDir и хочет сохранить это как файл mbox. Есть ли способ переписать сценарий, чтобы разрешить доставку почты в почтовый ящик пользователя, пока procmail ожидает блокировки bkp? Я пробовал:

:0c      #copy all mail to "Saved"
{
 :0:
 bkp
}

РЕДАКТИРОВАТЬ: я изменил вышеупомянутые рецепты с:0 w: to:0: так как w ожидает в программе, и ни один не выполняется в этом операторе.

Который позволит два письма, прежде чем он перестанет принимать почту снова, если я вручную заблокирую bkp во время тестов. Если я снимаю блокировку до истечения времени постфикса, почта будет доставлена. Я также хотел бы определить основную причину проблемы с блокировкой, но я пока не смог ее вызвать, кроме как сам заблокировав файл. Я добавил LOCKTIMEOUT=10, чтобы попытаться принудительно выполнить условие без успеха при обычной доставке почты.

Вот информация о версии procmail:

procmail v3.22 2001/09/10 Copyright (c) 1990-2001, Стивен Р. ван ден Берг Copyright (c) 1997-2001, Philip A. Guenther

Отправьте вопросы / ответы в список рассылки procmail, отправив по адресу:

И, конечно же, подписка и информационные запросы для этого списка:

Стратегии блокировок: dotlocking, fcntl() По умолчанию rcfile: $HOME/.procmailrc Может быть доступен для записи вашей основной группой

2 ответа

Решение

Вот что я сделал:

  • Чтобы проверить мою проблему, я создал образ vmware debian squeeze и ограничил число операций ввода-вывода в секунду на диске до 40, а на машине - 256 МБ.

  • Я использовал postfix, dovecot и procmail таким же образом, как и на моей производственной машине.

  • Я создал учетную запись пользователя и создал большие мультигигабайтные файлы, чтобы procmail мог писать в них.
  • Я установил nmon и sysstat для наблюдения за использованием дискового ввода-вывода и значениями tps для накопителя, пока выполнялись Outlook и операция локального копирования.

Что я нашел:

  • Было довольно легко получить тайм-ауты команд с постфиксом, но я все еще не смог сгенерировать ошибку блокировки, с которой столкнулся пользователь (за исключением использования fcntl для блокировки файла).
  • Я выбрал файл 4 ГБ для сохранения архива, затем запустил "Восстановить папку" в этой папке IMAP в Outlook 2011 при копировании файла 1,3 ГБ на сервере. Это вызвало достаточно ввода-вывода на диске сервера, чтобы генерировать таймауты в procmail.

Это не совсем убедительно, но похоже, что высокая загрузка диска вместе с клиентом outlook, обращающимся к почтовому файлу, который пытается заблокировать procmail, может легко задержать доставку почты достаточно долго, чтобы достичь тайм-аута команды, установленного в postfix.

Что я не пробовал:

  • Я не перекомпилировал исходный код и не отключил блокировку согласно FAQ 16 в исходном тексте procmail. В моем случае ошибка довольно редкая, и есть обходной путь регулярного вращения сохраненного файла, чтобы сохранить его небольшим.

Рассматривали ли вы использование небольших ежедневных / еженедельных резервных почтовых ящиков / файлов?

Вы можете использовать задания cron, чтобы переместить их в основную резервную копию.

man procmailex приводит примеры того, как получить имена назначения на основе date выход.
man procmail Приводится пример использования formail для файла почтового ящика postproces с блокировкой.

Другие вопросы по тегам