프로그램의 출력 내용을 모니터링하면서 특정 문자열이 검색되면 어떤 동작을 해야 할 일이 생겼다.
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
아무튼 뭐.. 타고난 머리는 좋지 않아도 검색 열심히 하면 뭐든 할 수 있는 세상이다.
'놀기 > 잡스러운 것' 카테고리의 다른 글
[bmNVR] LIVE555 (ubuntu 20.04) 빌드 (0) | 2023.08.30 |
---|---|
[FFMPEG] SMPTE Bar 영상 만들기 (with timecode) (0) | 2023.08.27 |
[Shell Script] 0부터 1씩 증가 시키며 숫자 출력하기 (0) | 2023.03.17 |
YUV Viewer (0) | 2023.02.15 |
[FFMPEG] 동영상 파일 기본 정보 읽기 (0) | 2023.02.11 |
댓글