Я пытаюсь создать скрипт мониторинга для наблюдения за коммуникацией 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}'