使用SOCATlogging在端口上收到的消息

我有一个开放端口的服务器,每秒接收50到1000条消息。 通过消息,我的意思是发送一行文本。

实质上,我们希望将这些消息logging在每小时(或x分钟)处理的文件中。

我创build了一个在后台运行的bash脚本(见下文),除了当我杀死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行剪成另一个文件,所以输出文件保持可pipe理的大小?

提前谢谢了

对于任何感兴趣的人来说,最终的解决方案如下所示,下面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 

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

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

不是那么明显! socat没有任何选择来改变半途中的连接。 这意味着你必须有点狡猾。 使用socat输出作为STDOUT,并管道到这个脚本:

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

您可以使用rotatelogs或multilog ,而不是重新发明轮子,它们都读取标准输入上的日志消息,并使用非常灵活的旋转配置将其写入日志文件。

即使更高一步,你所描述的功能与rsyslogd之类的功能非常相似。