У меня есть система, которая обрабатывает входящие электронные письма и отправляет их в приложение «черный ящик» на моей работе. Сценарий высокого уровня поддерживается 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
, пока что-то не будет прочитано. В худшем случае это придется сделать.
email_input
, а$()
рекомендуется вместо обратных кавычек. Баш может выполнять работуcat
:email_input=$(<"$pipe")
. Кроме того, чтобы обрезать файл:>"$nc_data"
- person Dennis Williamson   schedule 19.05.2012