TCPポートで改行以外の文字に対する割り込みメッセージのロギング

TCPポートで改行以外の文字に対する割り込みメッセージのロギング

私はTCPポートにログインするいくつかの外部サービスを監視するためのスクリプトセットを作成しています。

function handleMessage {
  while read message
  do
    # Handle $message
  done
}
nc -d $ipadd $port | handleMessage

このコードは、次のようにログメッセージが新しい行で区切られたときに正しく機能します。

サービス開始

エラー:ひどいことが起こりました。

サービスが中断されました

ただし、サービスの1つはLOGXXXXを使用してメッセージを区別し、メッセージに新しい行を追加できるようにするため、出力は次のようになります。

LOG0001 サービスが開始されました。 LOG0002エラー:ひどいことが発生しました。

SomeMethod(File1.java) の NullPointerException

SomeOtherMethod(File2.java)LOG0003 サービスが停止しました。

上記のコードを使用すると、各LOGXXXXセグメントセットの代わりに各行に対してhandlerMessageが呼び出され、改行文字を含むメッセージなしで時間が経過すると、私のスクリプトはメッセージ処理でずっと遅れます。

このTCPポートからデータを読み取ってカスタム区切り文字を中断するために使用できるncまたは他のプログラムのオプションはありますか?それとも、bash関数が1行あたりに呼び出されるのではなく、stdoutへのすべての書き込みを処理できるようにするオプションはありますか?

ベストアンサー1

ここで問題は回線にありますwhile read messagereadデフォルトでは改行文字で終了しますが、-dこのオプションを使用して他の文字を渡すことができます。

尋ねる質問はLOGXXXX行にあります。アイテムが完成したら、スクリプトはどのようにわかりますか?最後に特殊文字を入れることができる場合は、thatを使用できますread -d。それ以外の場合は、改行文字を別の文字に置き換えて再挿入できます。

したがって、あなたの例では次のようになります。

function handleMessage {
  while read message
  realmessage=`echo $message | tr '|' '\n'`
  do
    # Handle $realmessage
  done
}
nc -d $ipadd $port | tr '\n' '|' | handleMessage

したがって、すべての改行文字をaに置き換えて、すべての呼び出しに入り、それを分離し|ますread

おすすめ記事