Canalizar la salida de un script bash después de redirigir stderr [cerrado]

9

Debido a la forma en que mi proveedor de alojamiento hace las cosas, tengo que usar un sistema para los servicios.

Este servicio tiene un archivo de ejecución que ejecuta y canaliza a un segundo archivo de ejecución. Pero uso un paquete de Python (dado) que se registra en stderr en lugar de stdout y no puedo hacer que haga lo que quiero.

Entonces tengo un script de ejecución para mi servicio:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

que se canaliza en la ejecución del sistema de registro:

#!/bin/sh
exec multilog t ./main

Pero la tubería no conecta stderr (como se esperaba). Entonces, después de buscar en Google, agregué una redirección a mi carrera:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py 2>&1

Pero esto no resuelve mi problema: mis propios resultados (para stdout usando pythons print) se registran como se esperaba. La salida stderr no se registra.

Si redirijo mi runcript modificado en dos archivos, muestra que no hay redirección (stderr todavía está en stderr). ¿Cómo tengo que modificar mi redirección para trabajar?

xavor
fuente
55
exec ... 2>&1de hecho une error estándar en salida estándar. Entonces algo más está mal.
thrig
3
¿Hay alguna posibilidad de que el script de Python cierre stderr y lo vuelva a abrir como un archivo? Busque una llamada dup2()en el código. Cualquier idea de que la salida stderr se va? Otro pensamiento: quizás el archivo de ejecución de su proveedor de alojamiento esté redirigiendo stderr de esta manera antes de comenzar su código.
Edward Falk
1
¿Puede confirmar absolutamente que el texto se está enviando a stderr? Reemplace la secuencia de comandos con una que diga import sys; print("Hello, stderr", file=sys.stderr)para estar seguro.
rosuav
3
Realmente stderr? Pruebe esto exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.logy eche un vistazo a estos archivos de registro.
ingopingo
2
¿Qué sucede si usas bash en lugar de sh?
Luciano Andress Martini

Respuestas:

0

Por favor, inténtalo:

#!/usr/bin/env bash
exec 2>&1
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

es decir: exec 2>&1en una línea separada, diciéndole que redirija stderr a lo mismo que stdout va a (¿su terminal? Tenga en cuenta que cambié a bash en lugar de sh, para una menor portabilidad pero generalmente una confiabilidad mucho mejor. Si esto funciona, genial, si no algunas personas mejor informadas intervendrán. (No tengo tiempo para hacer investigaciones en este momento)

Olivier Dulac
fuente