Executando script Python usando shell script redirecionando a saída python

Executando script Python usando shell script redirecionando a saída python

Estou executando meu script python usando um script de shell run.shpara 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.pyscript, 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ê $COMMANDserá 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 bashas etapas usadas no processamento de comandos.

Responder2

Acabei usando o módulo redirect_stdoutpara 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.

informação relacionada