Ejecutar un script de Python usando un script de shell que redirige la salida de Python

Ejecutar un script de Python usando un script de shell que redirige la salida de Python

Estoy ejecutando mi script de Python usando un script de shell run.shpara reiniciarlo si falla:

#!/bin/sh

COMMAND='nohup python3 -u test.py run >> py.log &'
LOGFILE=restart.txt

writelog() {
  now=`date`
  echo "$now $*" >> $LOGFILE
}

writelog "Starting"
while true ; do
  $COMMAND
  writelog "Exited with status $?"
  writelog "Restarting"
done

Estoy corriendo

nohup sh -u run.sh > output&

El problema es que Python solo transmitiría la primera salida (print()) a py.log. ¿Cómo puedo obtener la salida transmitida al instante? Yo también lo he probado COMMAND=./test.py run >> py.log &. Apreciaría la ayuda. Gracias.

Respuesta1

Su script de shell está pasando la cadena 'run >> py.log &'a su test.pyscript, lo que probablemente hace que no se ejecute correctamente.

Necesitas cambiar tu script ligeramente:

#!/bin/sh

COMMAND='nohup python3 -u test.py run'
LOGFILE=restart.txt

writelog() {
  now=`date`
  echo "$now $*" >> $LOGFILE
}

writelog "Starting"
while true ; do
  $COMMAND >> py.log &
  writelog "Exited with status $?"
  writelog "Restarting"
done

Ahora $COMMANDse ejecutará en segundo plano y agregará su salida a py.log.

La razón por la que su secuencia de comandos original no funciona es porque las variables de shell se expanden después de configurar las redirecciones de salida, por lo que >>y &ya no se reconocieron como parte del comando de shell y se pasaron como cadena de argumento a su secuencia de comandos de Python. Puede consultar LESS='+/SIMPLE COMMAND EXPANSION' man bashlos pasos utilizados en el procesamiento de comandos.

Respuesta2

Terminé usando el módulo redirect_stdoutpara redirigir la salida a un archivo y luego usándolo sys.stdout.flush()después de cada uno print()y para el script de shell COMMAND='./test.py run'. Ahora está transmitiendo la salida en tiempo real.

información relacionada