使用 SOCAT 记录端口接收到的消息
问题:使用 SOCAT 记录端口接收到的消息 我有一个开放端口的服务器,每秒接收 50 到 1000 条消息。消息是指发送一行文本。 本质上,我们希望将这些消息记录在一个文件中,该文件将每小时(或 x 分钟)处理一次。 我创建了一个在后台运行的 bash 脚本(见下文),它可以工作,除非我终止 socat 进程(这样我可以将文件进行处理,它可以启动一个新文件),我们会收到部分消息,加上我确信我们在
·
问题:使用 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
有没有办法:
-
让socat旋转它的输出文件而不杀死进程
-
或者我们可以在 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
已为社区贡献12906条内容
所有评论(0)