
私は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 message
。read
デフォルトでは改行文字で終了しますが、-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
。