Cuando un mensaje que llegó de afuera no pudo ser entregado al destinatario interno, Exim intenta enviar un mensaje avisando de esta situación al origen del correo. Cuando luego de un cierto número de intentos es incapaz de hacer llegar este aviso, Exim marca este nuevo mensaje (el aviso de “no llegó su correo”) como frozen (congelado), de modo que no sea procesado nuevamente.
Ahora bien, cuando Exim analiza la cola de mensajes debe pasar uno por uno viendo su situación, si debe ser enviado, etc. Cuando encuentra un mensaje frozen, simplemente pasa volando, permitiendo una optimización del proceso. Pero cuando hay 50.000 mensajes frozen, el costo de abrir el mensaje para darse cuenta de esto se vuelve importante. En la práctica, el crecimiento desmedido de la cola de mensajes provoca que el servidor de correo se vuelva lento, con exim usando una buena parte del tiempo de CPU.
Procedimiento
Para borrar los mensajes encolados, es posible ocupar cualquiera de los dos comandos siguientes:
exim -C /etc/exim/exim_outgoing.conf -Mrm `exim -C /etc/exim/exim_outgoing.conf -bpu | awk '/\*\*\* frozen \*\*\*/ {print $3}'`
exim -C /etc/exim/exim_outgoing.conf -bpu | awk '/\*\*\* frozen \*\*\*/ {print $3}' | xargs exim -C /etc/exim/exim_outgoing.conf -Mrm
Ambas llamadas son bastante parecidas. En la primera la expresión entre comillas invertidas (`) es ejecutada por la shell, y luego el resultado obtenido se aplica en su lugar. En este caso, esto corresponde a la lista de mensajes que tienen “frozen” en sus datos.
En la segunda opción, en cambio, utilizamos el comando xargs para enviar múltiples parámetros a exim. xargs permite justamente esto: enviar una gran cantidad de parámetros (o un parámetro compuesto por una lista enorme) a un comando. Normalmente la shell tiene un límite mucho menor, por eso existe esto.
La opción “-C” indica qué archivo de configuración utilizar. Esto se puede deber a la configuración de múltiples colas debido al uso de Mailscanner. Ojo que este parámetro debe ser utilizado en las dos llamadas a exim: la que lista y la que borra. De otra forma estaremos listando mensajes que no se encuentran en la otra cola.
Errores posibles
Si aparecen mensajes diciendo que el mensaje XX ya no existe, lo más probable es que falte indicar el archivo de configuración a utilizar a alguna de las dos llamadas a Exim (la que lista o la que borra), a través del comando “-C”.