Я пишу свой собственный общий сценарий инициализации, я взял стратегии оттуда и там и придумал
trap 'kill $(jobs -p)' EXIT;
until $DAEMON $DAEMONOPTS > /var/log/${NAME}.log 2>&1 & wait ; do
echo "Server '$NAME' crashed with exit code $?. Respawning.." > /var/log/${NAME}.log 2>&1 & echo $!
sleep 1
done
Он правильно убивает дочерний процесс при остановке, он перезапускает службу, если умирает и т. Д.
Теперь мне нужно запустить этот фрагмент кода в качестве фонового задания, а не непосредственно при запуске)
Простое решение, которое работает и которое я уже тестировал, - это переместить эту часть в отдельный сценарий и & это.
Однако мне было интересно, есть ли способ сгруппировать эти команды и отправить их в фоновом режиме, не имея второго сценария оболочки для перемещения. В идеале я хотел сделать это по сути, чтобы все было в одном файле.
Это вообще возможно?
В сценарии оболочки вы можете сгруппировать любую последовательность команд в подоболочке, используя ( cmd; cmd )
а затем поместите эту подоболочку в фоновый режим с помощью &
как ты уже знаешь; например используя ваш пример кода:
(
trap 'kill $(jobs -p)' EXIT;
until $DAEMON $DAEMONOPTS > /var/log/${NAME}.log 2>&1 & wait ; do
echo "Server '$NAME' crashed with exit code $?. Respawning.." > /var/log/${NAME}.log 2>&1 & echo $!
sleep 1
done
) &
Хотя я должен сказать тебе until ... sleep
Идея о том, чтобы демон работал, немного странная. Не уверен, что мне бы хотелось, чтобы демон запускал бесконечный перезапуск в случае любая неудача. Возможно, хотя бы проверьте код выхода и перезапустите только в том случае, если он вышел "нечисто". Даже в этом случае, если он умирает из-за синтаксической ошибки файла конфигурации (при условии, что он имеет такую вещь), это также приведет к тому, что он войдет в бесконечный цикл перезапуска.