Как я могу добавить разделители сообщений к потоку UDP SOCAT - это трубопровод?

@ Решение Герберта, вероятно, самое простое, но вы также можете использовать lookarounds:

$ grep -Poz '(?<=:MENU1\n)[^:]*' file 
0. public
1. admin
2. webmail
  

-121--82049-

Причина его отказа с этой ошибкой - интерполяция $ (seq 1 $ k) внутри команды fanout .

Позвольте мне объяснить...

Выполнение seq 1 2 возвращает следующее значение:

1
2

Это значение находится внутри двойных кавычек, поэтому новая строка сохраняется в виде значимого текста. Поэтому команда fanout вычисляется следующим образом:

fanout server1  'umask 022 ; for k in 1
2 ; do for i in ear2 ; do echo /appl/as/bin/md5 /appl/as/var/spool/ears/abc/ ; done ; done'

Ваш ksh не понимает 2 на второй строке, поэтому он уступает.

Вы можете исправить это с помощью xargs , но затем вы попали во вторую потенциальную проблему, где вы используете k в качестве счетчика цикла, но $ k вычисляется до запуска цикла. Кроме того, имеется вложенный корпус, в котором $ ears необходимо оценить перед запуском сценария, но он используется в цикле, который изменяется во время выполнения.

Я нашел справочную страницу для fanout , но я не понимаю, почему вы запускаете цикл для одной системы ( server1 ), когда существует fanout для выполнения команды для нескольких систем. Если вы можете объяснить разницу между сервером и ухом , я могу предложить более чистый фрагмент кода. Мое первое предложение может быть таким:

ears='ear1,ear2'
cluster=abc
dmgr=server1

fanout "$dmgr" "/appl/as/bin/md5 /appl/as/var/spool/ears/${cluster}/{$ears}"

-121--254083-

Оригинальная оболочка не имела этой функции, но имела комментарии. Необходим механизм, позволяющий пользователю указать, какую оболочку/интерпретатор использовать. Этот механизм не должен излишне ломать старые системы (любые новые сценарии, написанные для исходной оболочки, должны быть разрешены для указания исходной оболочки, и не должен ломаться на старых системах (запущенных ранних версиях исходной оболочки), которые не знают об этой новой системе. Поэтому он должен выглядеть как комментарий к оригинальной оболочке. Эта новая система должна также снизить риск ложных триггеров, не возлагая при этом нагрузки на будущих пользователей.

Поэтому было решено добавить специальный комментарий в начале файла.

7
27.07.2018, 23:56
2 ответа

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

mkfifo mypipe
while sleep 3
do    printf "%sNONEWLINE" $RANDOM
done |
socat -u - UDP4:localhost:9999  &
socat -u -v UDP-RECV:9999 - >/dev/null 2>mypipe  &
cat -uv mypipe

будет выводить перед каждым элементом данных (, например,9430NONEWLINE)заголовок, начинающийся >с датой и длиной.

> 2018/07/28 10:29:33.965222  length=13 from=0 to=12
9430NONEWLINE> 2018/07/28 10:29:36.968335  length=14 from=13 to=26
26947NONEWLINE> 2018/07/28 10:29:39.971025  length=14 from=27 to=40
15126NONEWLINE
3
27.01.2020, 20:19

Используйте sed, чтобы добавить новую строку с помощью одной команды, чтобы избежать состояния гонки при использовании вывода SYSTEM:"cat; echo \"\n\"":

socat -u UDP-RECVFROM:9999,fork SYSTEM:"sed -e a\\\\"

2
27.01.2020, 20:19

Теги

Похожие вопросы