저는 TCP 포트에 로그인하는 일부 외부 서비스를 모니터링하기 위한 스크립트 세트를 작성 중입니다.
function handleMessage {
while read message
do
# Handle $message
done
}
nc -d $ipadd $port | handleMessage
이 코드는 아래와 같이 로그 메시지가 새 줄로 구분될 때 제대로 작동합니다.
서비스 시작
오류: 끔찍한 일이 발생했습니다.
서비스가 중단되었습니다
그러나 서비스 중 하나는 LOGXXXX를 사용하여 메시지를 구분하고 메시지에 새 줄을 추가할 수 있도록 허용하므로 출력은 다음과 같습니다.
LOG0001 서비스가 시작되었습니다. LOG0002 오류: 끔찍한 일이 발생했습니다.
SomeMethod(File1.java)의 NullPointerException
SomeOtherMethod(File2.java)LOG0003 서비스가 중지되었습니다.
위의 코드를 사용하면 각 LOGXXXX 세그먼트 집합 대신 각 행에 대해 handlerMessage가 호출되며 개행 문자가 포함된 메시지 없이 시간이 지나면 내 스크립트가 메시지 처리에서 훨씬 뒤처지게 됩니다.
이 TCP 포트에서 데이터를 읽고 사용자 정의 구분 기호를 중단하는 데 사용할 수 있는 nc 또는 다른 프로그램에 대한 옵션이 있습니까? 아니면 bash 함수가 줄당 호출되는 대신 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
호출에 들어간 다음 분리합니다.