Cómo redirigir la salida completa de un script cron

Tengo un cronjob simple que se ejecuta todos los días a las 18:35:

05 18 * * * ~/job.sh 2>&1 >> ~/job.log 

Por lo tanto, la salida de ~ / job.sh debe escribirse en ~ / job.log. En job.sh, hay algunos comandos de eco y se ejecutan algunos scripts de Python, por ejemplo:

 echo 'doing xyz' python doXYZ.py 

Ahora, independientemente de la salida que produzcan los scripts de Python, no se escriben en ~ / job.log. Solo veo el texto de eco en ~ / job.log. ¿Cómo puedo redireccionar la salida completa del script de shell a ~ / job.log?

Arkaitz tiene la solución más simple. Sin embargo, para ver qué hay de malo en tu fragmento, debemos ir al manual de bash:

Tenga en cuenta que el orden de redirecciones es significativo. Por ejemplo, el comando

  ls > dirlist 2>&1 

dirige tanto la salida estándar como el error estándar al archivo dirlist, mientras que el comando

  ls 2>&1 > dirlist 

dirige solo la salida estándar a archivo dirlist, porque el error estándar se duplicó desde la salida estándar antes de que la salida estándar se redirigiera a dirlist.

Entonces, aparentemente, la redirección de salida solo redirige al objective de la otra secuencia, no a la otra secuencia en sí. Cuando bash analiza su línea de comando, llegará a la cláusula 2>&1 y redireccionará stderr al objective de stdout , que en este punto sigue siendo la consola (o lo que sea que esté adjunto al stdout cron ). Solo después de esto será redirigido el stdout .

Así que lo que realmente quieres es:

 05 18 * * * ~/job.sh >>~/job.log 2>&1 

¿Has probado ~/job.sh &>> ~/job.log ?

Necesita redirigir la salida de la secuencia de comandos de python. Learning Python 2nd Edition recomienda lo siguiente:

 import sys sys.stdout = open('log.txt', 'a') # Redirects output to file ... print x, y, x # shows up in log.txt 

y continúa diciendo:

“Aquí, restablecemos sys.stdout a un objeto de archivo de salida abierto manualmente en modo agregado. Después del restablecimiento, cada statement de print en cualquier lugar del progtwig escribirá su texto al final del archivo log.txt. lugar de la salida original stream.”

Estoy bastante seguro de que esto debería funcionar en un caso general. El sistema operativo cambia el descriptor del archivo stdout cuando usa la redirección de shell.

Sin embargo, si su propio script de Python escribe directamente en la pantalla (tal vez abriendo / dev / tty), no se capturará en su log.txt. ¿Es ese el caso? ¿Falla incluso para un progtwig de python simple que solo hace un

 print "Hello" 

?