Запись сообщений, полученных на порт с SOCAT

У меня есть сервер с открытым портом, который получает от 50 до 1000 сообщений в секунду. Под сообщением я подразумеваю, что отправляется одна строка текста.

По существу, мы хотим записать эти сообщения в файл, который будет обрабатываться каждый час (или x минут).

Я создал bash script (см. ниже), который работает в фоновом режиме, и он работает, за исключением случаев, когда я убиваю процесс socat (так что я могу взять файл для обработки и начать новый файл). получить часть сообщения, плюс я уверен, что мы теряем сообщения в течение секунды секунды, что socat не работает.

DELAY="3600"
while true
do  
    NEXT_STOP=`date +%s --date "$DELAY second"`
    (
        while [ "$(date +%s)" -lt "$NEXT_STOP" ]
        do
            killall socat
            socat -u TCP-LISTEN:6116,reuseaddr,keepalive,rcvbuf=131071,reuseaddr OPEN:/var/ais/out_v4.txt,creat,append
        done
    ) & sleep $DELAY ; killall socat

    mv /var/ais/out_v4.txt "/var/ais/_socat_received/"$(date +"%Y-%m-%d-%T")"__out_v4.txt"
done

Есть ли способ:

  • Получить socat, чтобы повернуть свой выходной файл, не убивая процесс
  • Или мы можем очистить содержимое файла, пока SOCAT пишет ему. например вырезать первые 10000 строк в другой файл, поэтому выходной файл остается управляемым размером?

Большое спасибо заранее

Ответ 1

Для всех, кто интересуется окончательным решением, выглядит следующим образом: ключевое отличие от решения Nicholas ниже заключается в том, что мне нужно было сгладить PID для процесса socat, а не использовать $?:

#!/bin/bash
DELAY=600
SOCAT_PID=$(/bin/ps -eo pid,args | grep "socat -u TCP-LISTEN:12456" | grep -v grep | awk '{ print $1 }')

while `kill -0 $SOCAT_PID`
do  
  touch /var/ais/out.txt
  NEXT_STOP=`date +%s --date "$DELAY second"`
  while  `kill -0 $SOCAT_PID` && [ "$(date +%s)" -lt "$NEXT_STOP" ]
  do
    head -q - >> /var/ais/out.txt
  done
  mv /var/ais/out.txt "/var/ais/_socat_received/"$(date +"%Y-%m-%d-%T")"__out.txt"
done

Кроме того, добавление начала script в бесконечный цикл while, так что, когда клиент отключается, мы перезапускаем socat и ждем следующей попытки подключения:

while true
do
socat -u TCP-LISTEN:12456,keepalive,reuseaddr,rcvbuf=131071 STDOUT | /var/ais/socat_write.sh
done

Ответ 2

Не так очевидно! у socat нет вариантов изменения того, что он делает с соединением на полпути. Это означает, что вам нужно быть немного подлым. Используйте socat с выходом как STDOUT, и подключитесь к этому script:

#!/bin/bash
rv=0
while [ $rv -lt 1 ]
do  
  NEXT_STOP=`date +%s --date "$DELAY second"`
  while [ "$(date +%s)" -lt "$NEXT_STOP" ] && [ $rv -lt 1 ]
  do
    head -q - >> /var/ais/out_v4.txt
    rv=$?
  done
  mv /var/ais/out_v4.txt "/var/ais/_socat_received/"$(date +"%Y-%m-%d-%T")"__out_v4.txt"
done

Полностью непроверенный, но выглядит разумным?

socat -u TCP-LISTEN:6116,reuseaddr,keepalive,rcvbuf=131071,reuseaddr STDOUT | ./thescript.sh

Ответ 3

Вместо того, чтобы изобретать колесо, вы можете использовать rotatelogs или multilog, оба из которых считывают сообщения журнала на входе std и записывают их в файлы журнала с очень гибкой конфигурацией вращения.

Даже на один шаг выше описанная вами функциональность очень похожа на rsyslogd и т.д.