Я запускаю свой скрипт 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'
. Теперь он транслирует вывод в реальном времени.