Я использую Postfix для запуска сценария всякий раз, когда сообщение отправляется на определенный адрес. Этот сценарий представляет собой сценарий Perl и записывает журнал в файл, используя Log4perl. Log4perl ежедневно обновляет файл журнала.
Он работает хорошо, за исключением одного маленького углового корпуса. Сценарий не может выполнять запись в файл журнала, если размер файла журнала превышает 50 МБ.
После некоторого исследования Postfix выяснилось, что это может быть ограничение, установленное Postfix. Вот часть вывода из postconf
это может быть актуально.
$ postconf | grep size
berkeley_db_create_buffer_size = 16777216
berkeley_db_read_buffer_size = 131072
body_checks_size_limit = 51200
bounce_size_limit = 50000
header_size_limit = 102400
mailbox_size_limit = 51200000
message_size_limit = 10240000
tcp_windowsize = 0
$ postconf | grep virtual_mailbox_limit
virtual_mailbox_limit = 51200000
Есть ли какие-то параметры, которые можно изменить на удалите ограничение в 50 МБ для размера файла журнала создан из скрипта?
Вот настройки Log4perl для полноты.
$ cat /some/path/to/my/log4perlsettings.cfg
log4perl.logger.mylog = DEBUG,LOGGER
log4perl.appender.LOGGER = Log::Dispatch::FileRotate
log4perl.appender.LOGGER.TZ=PST
log4perl.appender.LOGGER.DatePattern=yyyy-MM-dd
log4perl.appender.LOGGER.filename = /some/path/to/my/logs/logfile.log
log4perl.appender.LOGGER.mode = append
log4perl.appender.LOGGER.max = 30
log4perl.appender.LOGGER.layout = PatternLayout
log4perl.appender.LOGGER.layout.ConversionPattern = [%d] %P %p %r %H %F %L %C - %m%n
Вероятно, это не актуально, но вот настройки псевдонима Postfix:
$ grep -r myscript /etc/postfix/
/etc/postfix/virtual:myscript@mymachine.example.net myscript
$ grep -r myscript /etc/aliases
myscript: "|/some/path/to/my/script.pl"
редактировать:
Вот результат /var/log/maillog
. Это повторяется много-много раз.
Dec 13 10:59:22 mymachine postfix/cleanup[22052]: EB5EA80196: message-id=<20141213015922.EB5EA80196@mymachine.example.net>
Dec 13 10:59:22 mymachine postfix/bounce[22431]: 7C11080190: sender non-delivery notification: EB5EA80196
Dec 13 10:59:22 mymachine postfix/qmgr[2109]: EB5EA80196: from=<>, size=3456, nrcpt=1 (queue active)
Dec 13 10:59:22 mymachine postfix/qmgr[2109]: 7C11080190: removed
Dec 13 10:59:23 mymachine postfix/smtp[22342]: EB5EA80196: to=<root@othermachine.example.net>, relay=mail.example.net[192.168.1.11]:25, delay=0.04, delays=0.01/0/0/0.03, dsn=2.0.0, status=sent (250 ok 1418435963 qp 19340)
Dec 13 10:59:23 mymachine postfix/qmgr[2109]: EB5EA80196: removed
Dec 13 10:59:39 mymachine postfix/smtpd[21267]: connect from unknown[192.168.2.12]
Dec 13 10:59:39 mymachine postfix/smtpd[21267]: CA0AB80190: client=unknown[192.168.2.12]
Dec 13 10:59:39 mymachine postfix/cleanup[21893]: CA0AB80190: message-id=<20141213015939.B625B1228002@othermachine2.example.net>
Dec 13 10:59:39 mymachine postfix/smtpd[21267]: disconnect from unknown[192.168.2.12]
Dec 13 10:59:39 mymachine postfix/qmgr[2109]: CA0AB80190: from=<root@othermachine2.net>, size=712, nrcpt=1 (queue active)
Dec 13 10:59:40 mymachine postfix/local[21269]: CA0AB80190: to=<myscript@mymachine.example.net>, relay=local, delay=0.43, delays=0.02/0/0/0.4, dsn=5.3.0, status=bounced (Command died with status 27: "/some/path/to/my/script.pl". Command output: Cannot write to '/some/path/to/my/logs/logfile.log': File too large at /usr/local/share/perl5/Log/Dispatch/File.pm line 141. )
Dec 13 10:59:40 mymachine postfix/cleanup[22052]: 3B8FD80196: message-id=<20141213015940.3B8FD80196@mymachine.example.net>
Dec 13 10:59:40 mymachine postfix/bounce[22431]: CA0AB80190: sender non-delivery notification: 3B8FD80196
Dec 13 10:59:40 mymachine postfix/qmgr[2109]: 3B8FD80196: from=<>, size=2897, nrcpt=1 (queue active)
Dec 13 10:59:40 mymachine postfix/qmgr[2109]: CA0AB80190: removed
Dec 13 10:59:40 mymachine postfix/smtp[21679]: 3B8FD80196: to=<root@othermachine2.example.net>, relay=mail.example.net[192.168.1.11]:25, delay=0.04, delays=0/0/0/0.03, dsn=2.0.0, status=sent (250 ok 1418435980 qp 19356)
Dec 13 10:59:40 mymachine postfix/qmgr[2109]: 3B8FD80196: removed
Важная строка, вероятно, такая:
Dec 13 10:59:40 mymachine postfix/local[21269]: CA0AB80190: to=<myscript@mymachine.example.net>, relay=local, delay=0.43, delays=0.02/0/0/0.4, dsn=5.3.0, status=bounced (Command died with status 27: "/some/path/to/my/script.pl". Command output: Cannot write to '/some/path/to/my/logs/logfile.log': File too large at /usr/local/share/perl5/Log/Dispatch/File.pm line 141. )
Эта ошибка возникает именно тогда, когда /some/path/to/my/logs/logfile.log
Размер файла составляет 50 МБ (51200000 байт).
Edit2:
Сценарий perl работает правильно при вызове из командной строки (т.е. без вызова из Postfix).
Это действительно ограничение, унаследованное от postfix. Причина в том, что когда вы пишете в сценарий, направляя доставку в канал, это считается почтовым ящиком, как если бы вы писали непосредственно в файл. Таким образом, любые ограничения, установленные для агента доставки постфикса, будут унаследованы сценарием.
Я могу придумать три способа обойти это: