Я пытаюсь создать сценарий оболочки, который проверяет, запущены ли 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

1 ответ1

0

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

  • Сценарий никогда не выходит за рамки первого 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:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .