Перезапустить при проверке сценария сбоя

355
Orophix

Я пытаюсь создать сценарий оболочки, который проверяет, запущены ли 2 разных процесса, и перезапускает их, если они не запущены. Я просто хочу, чтобы все было просто. Это правильный путь, потому что не похоже, что вторая часть работает ...

trap "exit" SIGINT  while true : do ./stream.sh echo "Stream has Crashed" done   trap "exit" SIGINT  while true : do ./current_song.sh echo "Current Song has Crashed" done 
0

1 ответ на вопрос

0
Kamil Maciorowski

Есть несколько вопросов:

  • Сценарий никогда не выходит за рамки первого, doneи это главная причина, по которой вторая часть не работает.
  • Там нет шебанга .
  • while true :странно. Оба trueи :являются встроенными в Bash, оба возвращают true . Единственного while trueбыло бы достаточно, то же самое с while :. Кажется, вы хотели ( ? ) Использовать оба варианта одновременно, и этот фрагмент кода даже «работает», то есть он не выходит из строя. Это не терпит неудачу, потому что это :ваше не встроенное, как я упоминал; это аргумент trueкоманды. trueотбрасывает свои аргументы командной строки. true :или true almost anythingэквивалентно true, так что ваши while true :работы, как while true.

Способ перезапуска множества отдельных процессов из одного скрипта выглядит следующим образом:

#!/bin/bash  trap "kill 0" SIGINT  while :; do process1; done & while :; do process2; done & # ... while :; do processN; done 

Это выполняет N whileциклов в отдельных оболочках (N-1 подоболочки и основная оболочка), поэтому каждый отдельный цикл выполняется параллельно, независимо. В вашем случае сценарий может быть:

#!/bin/bash  trap "kill 0" SIGINT  while : do ./stream.sh echo "Stream has Crashed" done &  while : do ./current_song.sh echo "Current Song has Crashed" done 

Ловушка убивает (пытается убить) все потомок благодаря этой kill 0уловке :

Все процессы в текущей группе процессов сигнализируются