Назад | Перейти на главную страницу

Как отправить группу команд в фоновом режиме

Я пишу свой собственный общий сценарий инициализации, я взял стратегии оттуда и там и придумал

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 Идея о том, чтобы демон работал, немного странная. Не уверен, что мне бы хотелось, чтобы демон запускал бесконечный перезапуск в случае любая неудача. Возможно, хотя бы проверьте код выхода и перезапустите только в том случае, если он вышел "нечисто". Даже в этом случае, если он умирает из-за синтаксической ошибки файла конфигурации (при условии, что он имеет такую ​​вещь), это также приведет к тому, что он войдет в бесконечный цикл перезапуска.