linux - 使用 SOCAT 记录在端口上收到的消息

标签 linux bash tcp port socat

我有一个开放端口的服务器,每秒接收 50 到 1000 条消息。我所说的消息是指发送单行文本。

本质上,我们希望将这些消息记录在一个文件中,该文件将每小时(或 x 分钟)处理一次。

我已经创建了一个在后台运行的 bash 脚本(见下文)并且它可以工作,除非我终止 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

有没有办法:

  1. 让 socat 在不终止进程的情况下轮换其输出文件
  2. 或者我们可以在 SOCAT 写入文件的同时清除文件的内容。例如将前 10000 行剪切到另一个文件中,以便输出文件保持可管理的大小?

提前致谢

最佳答案

对于任何感兴趣的人,最终解决方案如下所示,与下面的 Nicholas 解决方案的主要区别在于我需要 grep socat 进程的 PID 而不是使用 $?:

#!/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

此外,在无限循环中添加启动脚本,这样当客户端断开连接时,我们会重新启动 socat 并等待下一次连接尝试:

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

关于linux - 使用 SOCAT 记录在端口上收到的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13512760/

相关文章:

linux - 如何使用 Bash 将字符串添加到文件中的每一行

linux - 如何 gzip bash 中所有子目录中的所有文件

linux - 在 shell 中按名称对目录内容(包括隐藏文件)进行排序

java - 在 Android 设备上运行 root 命令

linux - 如何删除具有匹配模式的整行仅存在于列范围 75 到 104 中

C++ HTTP GET 请求问题?

linux - "main thread can dynamically grow its stack"是什么意思

bash - bash 中的 OR 逻辑运算符

c 中的客户端服务器聊天应用程序

c - tcp raw 程序中的 PCAP 函数。