【发布时间】:2012-11-10 20:31:24
【问题描述】:
我有一个开放端口的服务器,每秒接收 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 行剪切到另一个文件中,这样输出文件的大小仍然可以管理?
在此先感谢
【问题讨论】:
-
在进一步的研究中,我怀疑解决方案在于使用 EXEC 功能而不是打开。所以这个测试写入文件,但它又不旋转(即每秒创建一个新文件)。
socat -u TCP-LISTEN:124567 EXEC:"tee -a /root/socat_out_{$(date +"%Y-%m-%d-%T")}.txt" -
是每个 TCP 连接一条消息,还是您希望它在处理来自单个连接的一组消息的过程中轮转?后者更繁琐。前者不应该那么难:将 socat 设置为分叉服务器,调用脚本。该脚本只会将标准输入添加到文件中。当您想更改写入的文件时,请编写一个包含新文件名的新脚本,并将其 mv 放在旧脚本之上。监听的 socat 将无缝地移交要转储到新文件中的连接。确保使用 O_APPEND 等。
-
嗨 Nicholas,发送消息的服务器是持久的,因此它一次保持连接数小时/数天(发送数百万条消息),因此我们需要部分轮换文件。有什么想法吗?