Я реализовал базовый SMTPServer, который отлично работает, но я столкнулся с проблемой, и я не знаю, как ее исправить.
При проверке файловых дескрипторов, открытых для $PID процесса, выполняющего мой скрипт (ls -l /proc/$PID/fd/ | grep "socket:" | wc -l
), количество файловых дескрипторов продолжает увеличиваться.
Поскольку я фильтрую по «сокету:», очевидно, что некоторые сокеты остаются открытыми, потому что некоторые почтовые провайдеры не закрываются явно.
Я протестировал локально некоторые скрипты Python, подключающиеся к этому коду SMTPServer
, и даже если я не закрываю соединение, когда клиентский процесс останавливается, клиент закрывает соединение и дескриптор файла удаляется.
Я думал о реализации тайм-аута для ожидания или перезапуска процесса каждые N подключений, но это просто плохие исправления для более серьезной проблемы.
Вы знаете, откуда это взялось бы?
Для информации, моя оболочка process_message
окружена
try:
# ...
except:
return '450 Please try again later"
Поэтому исключение из моего кода должно быть хорошо обработано.
Вот мой код (упрощенный):
class MyMXServer(SMTPServer):
def __init__(self, host='127.0.0.1', port=25):
self.srs = SRS.new(os.getenv('SRS_KEY', 'some passwd'))
return SMTPServer.__init__(self, (host, port), None)
def process_message(self, greeting, peer, mailfrom, recipients, data, **kwargs):
try:
return self._process_message(greeting, peer, mailfrom, recipients, data, **kwargs)
except:
logging.getLogger('err').exception('[EXCEPTION]')
return '450 Please try again later.'
def _process_message(self, greeting, peer, mailfrom, recipients, data, **kwargs):
# Various things like checking DNSBL, SPF, Spam, etc
grep -c
вместоgrep | wc -l
. - person tripleee   schedule 18.01.2018