[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

sed: couldn't write 72 items to {standard output}: Broken pipe



Hola.


Estoy desarrollando para una empresa unos pequeños scripts a medida para 
complementar a un servidor de correo propietario (CommuniGate) y dotarle de 
funcionalidades que requieren.

Básicamente existen unas "Queue Rules" es las que puedes definir una "Action" 
que sea ejecutar un programa externo (mi script) y pasarle como parámetro el 
path al fichero (correo) que se está procesando (el que ha cumplido la regla 
y sufre la "Action").

He hecho multitud de pruebas y el script funciona perfectamente ejecutado 
manualmente por consola pasándole como parámetros el path a ficheros de 
correo de todos los tamaños (ningún error).

Pero cuando está en producción y es invocado por el CommuniGate resulta que 
falla al procesar archivos de correo de cierto tamaño (más de 100KB más o 
menos) y los Logs del servidor de correo muestran un error tal que así:



****************************************************************
11:23:54.64 1 ENQUEUERRULES [9570439] rule(myRule) action #1:
execute stderr: sed: couldn't write 72 items to {standard output}:
Broken pipet: error de escritura: Tuberia rota
****************************************************************



El fragmento de mi script que usa "sed" es éste:

------------------------------------------------------------------------------------------------------------
cat $correo_original | sed '1,/^$/ d' | formail -X "" > $cabecera_original
------------------------------------------------------------------------------------------------------------


Lo que hace es coger el correo original y extraer sólo las cabeceras 
(eliminando el cuerpo y una cabecera especial que añade al inicio el propio 
CommuniGate mientras el correo está encolado).
Nota: Agradezco de nuevo la ayuda a la gente que me indicó como hacer 
precisamente esta parte del script.



Un problema similar sucede si uso "awk" en vez de "sed":
------------------------------------------------------------------------------------------------------------
cat $correo_original | awk 'ok{print}/^\s*$/{ok=1}' | formail -X "" >
$cabecera_original
------------------------------------------------------------------------------------------------------------


En cualquier caso, quiero dejar BIEN CLARO que NO es un problema del script, 
ya que ejecutado en consola funciona PERFECTAMENTE con ficheros de 10MB si 
hace falta.

Este error se produce SOLO cuando el script es invocado por el CommuniGate 
porque un correo cumple la regla que lo llama, y dicho correo supera los 
100KB (o similar). Si el correo es menor el script funciona perfectamente.


Yo me temo que tal vez el CommuniGate establezca un tiempo límite a los 
programas externos a los que llama y que tal vez por eso los correos grandes 
no tienen tiempo de ser procesados por mi script que es interrumpido y causa 
el error. No lo sé. En cualquier caso hoy mismo he escrito al soporte de 
dicho servidor de correo, a ver qué me dicen mañana.


No obstante, me gustaría saber qué significa el error de los Logs:

****************************************************************
11:23:54.64 1 ENQUEUERRULES [9570439] rule(myRule) action #1:
execute stderr: sed: couldn't write 72 items to {standard output}:
Broken pipet: error de escritura: Tuberia rota
****************************************************************

¿Cuándo se puede producir este error de "sed"?
¿por qué se podría producir llamado desde el CommuniGate y NUNCA si lo ejecuto 
manualmente en consola?
¿tal vez porque es interrumpido?
¿o por un problema de algún buffer?



Desde ya gracias por cualquier ayuda y un saludo a todos.



PD: Por si pudiese ser de utilidad escribo las variables de entorno desde 
consola como root y también las variables de entorno desde el CommuniGate 
(las que hereda mi script cuando es ejecutado desde el CommuniGate). Yo no 
veo nada raro pero quién sabe:


Variables de entorno en modo normal:
***********************************************************************
PWD=/root
LC_MESSAGES=es_ES@euro
HOSTNAME=mailbackup.dominio.com
LS_OPTIONS=--color=auto
QTDIR=/usr/lib/qt-2.3.0
LESSOPEN=|/usr/bin/lesspipe.sh %s
KDEDIR=/usr
USER=root
MACHTYPE=i386-redhat-linux-gnu
LC_ALL=es_ES@euro
OLDPWD=/root
MAIL=/var/spool/mail/root
INPUTRC=/etc/inputrc
BASH_ENV=/root/.bashrc
LANG=es_ES@euro
GTK2_RC_FILES=/root/.gtkrc-2.0
LOGNAME=root
SHLVL=1
LC_CTYPE=es_ES@euro
MM_CHARSET=ISO-8859-15
SHELL=/bin/bash
USERNAME=root
HOSTTYPE=i386
OSTYPE=linux-gnu
HISTSIZE=1000
TERM=xterm
HOME=/root
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin:/usr/X11R6/bin/:/usr/games/:/root/bin:/root/bin



Variables de entorno desde CommuniGate:
***********************************************************************
PWD=/var/CommuniGate
LD_ASSUME_KERNEL=2.4.1
BOOT_FILE=/boot/vmlinuz-2.4.20
HOSTNAME=mailbackup.dominio.com
CONSOLE=/dev/console
PREVLEVEL=N
AUTOBOOT=YES
CONFIRM=
runlevel=3
MACHTYPE=i386-redhat-linux-gnu
LANG=es_ES@euro
SHLVL=3
previous=N
BOOT_IMAGE=linux-2.4.20
SHELL=/bin/bash
HOSTTYPE=i386
OSTYPE=linux-gnu
HOME=/
TERM=linux
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
RUNLEVEL=3
INIT_VERSION=sysvinit-2.78




-- 
y hasta aquí puedo leer...



Reply to: