Обработка ввода из скрипта, переданного в netcat

У меня есть система, которая обрабатывает входящие электронные письма и отправляет их в приложение «черный ящик» на моей работе. Сценарий высокого уровня поддерживается inittab, чтобы всегда запускать и запускать дочерний сценарий для фактической работы с этой командой:

$SCRIPT | nc -l -p $PORT

Сам скрипт читает из именованного канала, немного анализирует и обрабатывает данные перед вызовом echo для перетасовки данных обратно через netcat в процесс, подключенный к $PORT.

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

Мой скрипт (в двух словах) выглядит так:

while true ; do
  email_input="`cat "$pipe"`"
  if [[ $email_input =~ .*escape_queue.* ]] ; then
    break;
  fi
  echo "`parse`"
done

Я открыт для возможности изменить поток программы, я просто не могу понять, как я смогу читать данные, поступающие асинхронно, поскольку скрипт блокируется cat $pipe до тех пор, пока не будет получено новое электронное письмо для обработки.

Если это не ясно, я новичок в написании сценариев bash и всегда открыт для предложений по улучшению.

ОБНОВЛЕНИЕ Я изменил вызов сценария на

$SCRIPT | nc -l -p $PORT > $nc_data

и в самом скрипте

netcat_response="`cat "$nc_data"`";
if [[ "$netcat_response" =~ "exit" ]] ; then
  cat /dev/null > $nc_data
  break;
fi

В этот момент сценарий завершается, как только новое сообщение поступает в FIFO. Это означает, что я всегда буду терять 1 сообщение, поскольку оно будет прочитано сценарием, а затем сценарий завершится. Сценарий по-прежнему блокируется на cat, пока что-то не будет прочитано. В худшем случае это придется сделать.


person Grambot    schedule 18.05.2012    source источник
comment
Нет необходимости использовать внешние кавычки в вашем назначении для email_input, а $() рекомендуется вместо обратных кавычек. Баш может выполнять работу cat: email_input=$(<"$pipe"). Кроме того, чтобы обрезать файл: >"$nc_data"   -  person Dennis Williamson    schedule 19.05.2012


Ответы (1)


Вы можете закрыть nc через определенное время из EOF стандартного ввода.

$SCRIPT | nc -l -q 5 -p $PORT > $nc_data

-q — это возможность выйти через определенное количество секунд.

person staticsafe    schedule 18.05.2012
comment
Спасибо за ответ, кажется, это решило бы мои проблемы, но, к сожалению, вот результат: nc: illegal option -- q - person Grambot; 18.05.2012
comment
Если это FreeBSD, попробуйте параметр -w - person staticsafe; 18.05.2012
comment
HP-UX. Корпоративный сервер, поэтому у меня очень мало контроля над программными пакетами. - person Grambot; 18.05.2012
comment
@TheCapn Я думаю, вам придется вручную написать сценарий для EOF стандартного ввода, этот поток может помочь вам в дальнейшем - ссылка - person staticsafe; 18.05.2012
comment
Мне удалось заставить его работать с моим дополнением к $nc_data. У него есть одна постоянная проблема, которую я могу обойти, поскольку это ошибка приложения «черный ящик», с которым я работаю. Я ценю помощь! - person Grambot; 22.05.2012
comment
Grambot получил illegal option, потому что флаги были не в порядке... @staticsafe имел -q 5 между флагом порта и номером порта (-p -q 5 $PORT) - person inanutshellus; 14.01.2016