我有一台具有开放端口的服务器,该服务器每秒接收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
    

    另外,在无限的while循环中添加启动脚本,以便当客户端断开连接时,我们重新启动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/

    10-10 02:21