Вы видели ExecStartPre в документации по сервису systemd?
Я бы предложил поместить тест вашей базы данных в сценарий, использовать exit 0
в случае успеха и exit 1
в случае неудачи, а затем запустить его с помощью ExecStartPre
. Затем вы запустите свое приложение, используя ExecStart
.
В итоге я использовал модуль redirect_stdout
для перенаправления вывода в файл, а затем использовал sys.stdout.flush()
после каждого print()
и для сценария оболочки COMMAND='./test.py run'
. Теперь он транслирует вывод в реальном времени.
Ваш сценарий оболочки передает строку '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
для шагов, используемых при обработке команд.