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

Вы видели ExecStartPre в документации по сервису systemd?

Я бы предложил поместить тест вашей базы данных в сценарий, использовать exit 0в случае успеха и exit 1в случае неудачи, а затем запустить его с помощью ExecStartPre. Затем вы запустите свое приложение, используя ExecStart.

0
09.03.2020, 23:31
2 ответа

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

0
28.04.2021, 23:21

Ваш сценарий оболочки передает строку '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для шагов, используемых при обработке команд.

0
28.04.2021, 23:21

Теги

Похожие вопросы