14

1秒あたり50〜1000件のメッセージを受信するポートが開いているサーバーがあります。メッセージとは、1行のテキストが送信されることを意味します。

基本的に、これらのメッセージを1時間(または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

次の方法はありますか?

  1. プロセスを強制終了せずに出力ファイルをローテーションするようにsocatを取得します
  2. または、SOCATがファイルに書き込んでいる間に、ファイルの内容を削除できますか。たとえば、最初の10000行を別のファイルにカットして、出力ファイルを管理可能なサイズのままにしますか?

よろしくお願いします

4

3 に答える 3

7

最終的な解決策に興味がある人は次のようになります。以下のNicholas解決策との主な違いは、$ ?:を使用するのではなく、socatプロセスのPIDをgrepする必要があることです。

#!/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
于 2012-11-23T13:19:33.803 に答える
2

車輪の再発明の代わりに、rotatelogsまたはmultilogを使用できます。どちらも、std入力でログメッセージを読み取り、非常に柔軟なローテーション構成でログファイルに書き込みます。

さらに一歩進んだ、あなたが説明した機能は、rsyslogdなどが行うものと非常に似ています。

于 2014-09-04T11:22:51.380 に答える
0

それほど明白ではありません!socatには、接続の途中で行うことを変更するためのオプションはありません。それはあなたが少し卑劣でなければならないことを意味します。出力をSTDOUTとしてsocatを使用し、次のスクリプトにパイプします。

#!/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
于 2012-11-22T17:00:47.350 に答える