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?
fuente
exec ... 2>&1
de hecho une error estándar en salida estándar. Entonces algo más está mal.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.import sys; print("Hello, stderr", file=sys.stderr)
para estar seguro.exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log
y eche un vistazo a estos archivos de registro.Respuestas:
Por favor, inténtalo:
es decir:
exec 2>&1
en 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)fuente