Запуск скрипта Python с использованием скрипта оболочки, перенаправляющего вывод Python

Запуск скрипта Python с использованием скрипта оболочки, перенаправляющего вывод Python

Я запускаю свой скрипт Python с помощью скрипта оболочки, run.shчтобы перезапустить его в случае сбоя:

#!/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

я бегу

nohup sh -u run.sh > output&

Проблема в том, что python передаст в py.log только первый вывод (print()).. Как мне вывести потоковое сообщение мгновенно. Я тоже пробовал COMMAND=./test.py run >> py.log &. Буду признателен за помощь. Спасибо.

решение1

Ваш скрипт оболочки передает строку 'run >> py.log &'вашему test.pyскрипту, что, вероятно, приводит к его неправильной работе.

Вам нужно немного изменить свой сценарий:

#!/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

Теперь ваш код $COMMANDбудет работать в фоновом режиме и добавлять свой вывод в py.log.

Причина, по которой ваш исходный скрипт не работает, заключается в том, что переменные оболочки расширяются после установки перенаправлений вывода, поэтому >>и &больше не распознаются как часть команды оболочки и не передаются в качестве строки аргумента в ваш скрипт Python. Вы можете обратиться LESS='+/SIMPLE COMMAND EXPANSION' man bashк шагам, используемым при обработке команд.

решение2

Я в итоге использовал модуль redirect_stdoutдля перенаправления вывода в файл, а затем использовал sys.stdout.flush()после каждого print()и для скрипта оболочки COMMAND='./test.py run'. Теперь он транслирует вывод в реальном времени.

Связанный контент