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

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

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

старт.ш

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

петля.sh

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

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

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

решение1

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

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

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

решение2

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

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

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

EOF

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

решение3

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

pipexec -- [NETCAT netcat localhost 1099]  [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}'

Связанный контент