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 [EMAIL PROTECTED] 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 [EMAIL PROTECTED] OLDPWD=/root MAIL=/var/spool/mail/root INPUTRC=/etc/inputrc BASH_ENV=/root/.bashrc [EMAIL PROTECTED] GTK2_RC_FILES=/root/.gtkrc-2.0 LOGNAME=root SHLVL=1 [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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...