Назад | Перейти на главную страницу

Устранение проблемы с периодической блокировкой файлов в 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: на: 0: поскольку w ожидает выполнения программы, и в этом операторе ничего не выполняется.

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

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

procmail v3.22 2001/09/10 Авторские права (c) 1990-2001, Стивен Р. ван ден Берг Авторские права (c) 1997-2001, Филип А. Гюнтер

Отправляйте вопросы / ответы в список рассылки, связанный с procmail, отправляя их по адресу:

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

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

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

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

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

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

Что я нашел:

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

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

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

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

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

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

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