我有一个带有开放端口的服务器,每秒接收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
有办法:
非常感谢提前
答案 0 :(得分:3)
对于任何感兴趣的人,最终解决方案如下所示,下面对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
答案 1 :(得分:1)
您可以使用rotatelogs或multilog而不是重新发明轮子,它们都读取std输入上的日志消息,并使用非常灵活的旋转配置将它们写入日志文件。
即使更高一级,您描述的功能与rsyslogd之类的功能非常相似。
答案 2 :(得分:0)
不太明显! 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