BASH - Связывание 2 процессов, завершение процесса 2 при завершении процесса 1

Я собираюсь повторить то, что я понял о настройке, и надеюсь, что это правильно; если нет, пожалуйста, обновите вопрос. Вот картинка, IP адреса составлены:

Computer A      Blackbox B      Blackbox C      Computer D
Laptop etc.     Embedded        Embedded        Laptop
10.0.0.1/24 --- 10.0.0.2/24... 10.0.1.2/24 --- 10.0.1.1/24
                Port 123        Port 123

Итак, A и B соединены через Ethernet (LAN ), B и C через вашу радиостанцию, а C и D снова через Ethernet. Существует приложение, работающее на B и C, которое прослушивает порт 123 и пересылает все с этого порта или на него на другую сторону по радио. Вы хотите запустить VLC на A и D и транслировать видео, чтобы продемонстрировать задержку.

В этом случае я бы установил туннель с socatследующим образом. На А,

socat TCP4:10.0.0.2:12 TUN:10.0.2.1/24,iff-up 

и на Б,

socat TCP4:10.0.1.2:12 TUN:10.0.2.2/24,iff-up 

Проверьте с помощью ip routeна A и D, что у вас есть что-то вроде

10.0.2.0/24 dev tun0 proto kernel scope link src...

Это своего рода притворство, что A и D подключены напрямую, как по локальной сети, как на этом рисунке:

A                 D
10.0.2.1/24 ----  10.0.2.2/24
tun0              tun0

Проверьте, работает ли это, выполнив ping 10.0.2.2из A, а если радиосоединение двунаправленное, с помощью ping 10.0.2.1из D. Если соединение не двунаправленное, у вас могут возникнуть проблемы, я не уверен.

(Я проверил это, используя немного другую настройку, но не могу проверить однонаправленное соединение. Я не тестировал потоковую передачу VLC, как описано ниже ).

Теперь вы можете запустить поток, отправляющий экземпляр VLC, на A и поток, принимающий экземпляр VLC, на D. Теоретически все протоколы должны работать (, если радиосоединение двунаправленное ), попробуйте их все. Если радиосоединение однонаправленное, RTP и UDP должны работать. Пункт назначения потока — это10.0.2.2(адрес туннеля D )для методов UDP и RTP. Если вы отправляете через HTTP, получателю нужно что-то вроде vlc http://10.0.2.1:8080/go.mpg.

0
05.11.2019, 05:45
2 ответа

Запустите вторую функцию как фоновый подпроцесс -, а затем завершите все подпроцессы при выходе из сценария оболочки:

second_process () {
  while true
    do 
    wc -l output.txt
    sleep 1
    done
}


clean_db () {
  second_process &
  for i in $(seq 5);
      do
        echo "kfjdjkfdf" >> output.txt
    echo "Done adding" $i
    sleep 1
      done 
}

clean_db
pkill -P $$

Обратите внимание, что pkill -P $$убивает все подпроцессы -.

0
28.01.2020, 03:08

Окончательное и полное решение состоит в следующем:

Check_process () {
 while true
do 
    wc -l output.txt | awk '{ print $1 }'
    sleep 5
done
}

clean_db () {
# The following sets build in bash trap for Ctrl+C and kills background process when Ctrl+C is detected
trap 'kill $BGPID; exit' INT 
Check_process &
BGPID=$!

    while read i
      do
        Some_long_process >> output.txt

      done < input_db    
}

clean_db
0
28.01.2020, 03:08

Теги

Похожие вопросы