Estoy ejecutando mi script de Python usando un script de shell run.sh
para 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.py
script, 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 $COMMAND
se 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 bash
los pasos utilizados en el procesamiento de comandos.
Respuesta2
Terminé usando el módulo redirect_stdout
para 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.