Estou executando meu script python usando um script de shell run.sh
para reiniciá-lo se travar:
#!/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
Estou correndo
nohup sh -u run.sh > output&
O problema é que o python transmitiria apenas a primeira saída (print()) para py.log. Como posso obter a saída transmitida instantaneamente. Eu também tentei COMMAND=./test.py run >> py.log &
. Gostaria muito de receber a ajuda. Obrigado.
Responder1
Seu script de shell está passando a string 'run >> py.log &'
para o seu test.py
script, o que provavelmente está fazendo com que ele não seja executado corretamente.
Você precisa alterar um pouco seu script:
#!/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
Agora você $COMMAND
será executado em segundo plano e anexará sua saída ao arquivo py.log
.
A razão pela qual seu script original não funciona é porque as variáveis do shell são expandidas depois que os redirecionamentos de saída são definidos, de modo que >>
e &
não foram mais reconhecidos como parte do comando shell e passados como a string de argumento para o seu script Python. Você pode consultar LESS='+/SIMPLE COMMAND EXPANSION' man bash
as etapas usadas no processamento de comandos.
Responder2
Acabei usando o módulo redirect_stdout
para redirecionar a saída para um arquivo e depois usando sys.stdout.flush()
cada um print()
e para o script de shell COMMAND='./test.py run'
. Agora está transmitindo a saída em tempo real.