Исправление проблемы с блокировкой файлов в 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 с блокировкой.