Запуск сценария bash bash в фоновом режиме

Я пытаюсь создать сценарий мониторинга, чтобы наблюдать связь localhost с помощью netcat. У меня есть два сценария, которые я создал, один для запуска цикла мониторинга и один для самого цикла. Они заключаются в следующем:

start.sh

#!/bin/bash netcat localhost 1099 | bash loop.sh & 

loop.sh

 #!/bin/bash while read sInput; do ...do something with $sInput done 

Простое выполнение этого приложения без использования на переднем плане отлично работает, но как только я попытаюсь запустить этот скрипт в фоновом режиме, он сразу переходит из режима работы в остановленный. Может кто-нибудь, пожалуйста, просветите меня, почему это происходит и как облегчить проблему.

Моя конечная цель состоит в том, чтобы иметь скрипт bash, который я могу создать с помощью сценария daemon linux, и все работает отлично. Ваша помощь приветствуется.

  • Выполнить ту же команду несколько раз в фоновом режиме
  • Как запустить два процесса и узнать, когда они заканчиваются в bash
  • Обнаружение на удаленном хосте, на котором были обработаны файлы
  • Не можете отменить mplayer?
  • Всякий раз, когда я набираю неправильную команду, мой терминал пытается запустить эту команду в фоновом режиме
  • Как подавить код завершения готовых фоновых заданий
  • Почему некоторые программы немедленно возвращаются в оболочку, а другие - пока выполнение не завершено?
  • tmux new-window - дождитесь окончания сеанса?
  • 3 Solutions collect form web for “Запуск сценария bash bash в фоновом режиме”

    Похоже, что он читает со стандартного ввода (stdin). Попробуйте добавить в netcat параметр -d (Не пытайтесь читать из stdin). Или перенаправлять в командной строке:

     netcat localhost 1099 <&- | bash loop.sh & 

    Вы также можете использовать nohup чтобы убедиться, что он не пострадает, когда / если вы выйдете из этой оболочки до ее остановки.

    Процесс netcat считывается со стандартного ввода. Поскольку он подключен к терминалу, группа процессов, в которой находится netcat (т.е. конвейер), должна работать на переднем плане.

    Вам нужно подключить что-то в начале конвейера, который отправит вход, который ожидает сервер. Например, с HTTP-сервером у вас может быть что-то вроде

     netcat localhost 1099 <<EOF | … & GET HTTP/1.0 http://localhost:1099/somewhere X-Header: wibble EOF 

    Если сервер не считывает никаких данных, переадресуйте ввод netcat из /dev/null .

    Обнаружили утилиту, которая обещает предоставить каналы без необходимости в отдельном новом демонизированном сценарии bash. Может пригодиться: https://github.com/flonatel/pipexec

     pipexec -- [NETCAT netcat localhost 1099] [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}' 
    Linux и Unix - лучшая ОС в мире.