본문 바로가기
놀기/잡스러운 것

[Shell Script] 파일 내용 모니터링

by Hi~ 2023. 3. 17.

프로그램의 출력 내용을 모니터링하면서 특정 문자열이 검색되면 어떤 동작을 해야 할 일이 생겼다.

Open Source 프로그램이어서 무식하게 프로그램을 수정하는 것도 방법이겠지만, 무식한 짓이다.

 

그 프로그램의 출력 결과가 로그 파일로 생성된다면 그 로그 파일을 사용하면 되겠지만 그렇지 않다면 프로그램 실행 시, 리다이렉션을 하여 출력 결과를 파일로 저장할 수 있다. 이렇게 생성된 로그 내용은 다들 알고 있는 tail 명령어를 사용하여 확인할 수 있다. 이 tail의 동작을 활용하여 원하는 기능을 Shell Script로 만들어 보려 한다. 물론, 구글의 도움을 얻어서... ㅎ

 

#!/bin/bash

echo "Monitoring ..."
tail -n 0 -f log.txt | while read LOGLINE
do
	[[ "${LOGLINE}" == *"busyman"* ]] && pkill -P $$ tail
done
echo "Found ..."

 

출력 결과가 log.txt에 쌓인다고 가정하고 해당 파일을 tail 명령어를 사용하여 읽는다. 이때 -f 옵션만 사용하면 이전에 쌓여 있는 내용이 읽혀 원치 않은 결과가 나올 수 있으므로 -n 옵션도 추가로 사용한다.

tail 결과에서 busyman이 검색될 경우, 아래와 같이 tail 프로그램을 죽인다. 모든 tail을 죽이면 안 되고 자신이 PPID인 놈들 중에 tail을 죽인다. 즉, script 내에서 실행된 tail을 죽여 while 문을 탈출한다.

 

pkill -P $$ tail

 

log.txt에 출력 결과가 쌓이는 환경을 만들기 위해 echo 명령어로 문자열을 넣으면 아래와 같이 동작한다.

 

$ ./file_monitoring_ex1.sh 
Monitoring ...
Found ...
$

 

$ echo "busym" >> log.txt 
$ echo "busyman" >> log.txt

 

물론, 완벽하지는 않다. 예를 들어 log.txt 파일이 삭제 후, 다시 생성되면 tail이 동작하지 않는다. 이런 문제는 보완해야 할 부분이다.

 

그리고 while을 하나 더 사용하여 추가 작업을 할 수 있다. 내가 원한 것은 이런 것이었다. 어떤 프로그램을 특정 조건에 재시작해야 하는데 마땅치 않았다. 그래서 프로그램 실행 시, 결과를 log.txt와 같이 파일로 리다이텍션 후에 그 파일을 읽어 내가 원하는 문자열이 나오면 그 프로그램을 죽였다 다시 시작하고 이런... ㅎㅎ 

 

#!/bin/bash

echo "Monitoring ..."
while [ true ]
do
	# 내가 원하는 작업을 여기서 한다.
	# 프로그램을 새로 실행하던가 등등등
	echo -n "" > log.txt
	tail -n 0 -f log.txt | while read LOGLINE
	do
		[[ "${LOGLINE}" == *"busyman"* ]] && pkill -P $$ tail
	done
	echo "Found ..."
	# 오케이. 내가 원하는 문자열 발견...
done

 

아무튼 뭐.. 타고난 머리는 좋지 않아도 검색 열심히 하면 뭐든 할 수 있는 세상이다.

 

댓글