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: