![TCP 포트에서 줄 바꿈 이외의 문자에 대한 인터럽트 메시지 로깅](https://linux55.com/image/28553/TCP%20%ED%8F%AC%ED%8A%B8%EC%97%90%EC%84%9C%20%EC%A4%84%20%EB%B0%94%EA%BF%88%20%EC%9D%B4%EC%99%B8%EC%9D%98%20%EB%AC%B8%EC%9E%90%EC%97%90%20%EB%8C%80%ED%95%9C%20%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8%20%EB%A9%94%EC%8B%9C%EC%A7%80%20%EB%A1%9C%EA%B9%85.png)
저는 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
호출에 들어간 다음 분리합니다.