Linux 'watch'

`watch`로 실시간 모니터링하기 (feat. `grep`)

개요

watch는 명령을 일정 주기로 다시 실행하고 화면 전체를 다시 그린다. 개수, 상위 N개, 스냅샷 같은 즉석 라이브 대시보드를 만들 때 쓴다. 새로 들어오는 줄만 스트리밍하고 싶다면 tail -F | grep이 낫고, 주기적 집계가 필요하면 watch를 쓴다.

핵심 옵션

  • 주기: -n SECS
  • 변경분 강조: -d
  • ANSI 색상 통과: --color
  • 따옴표에 주의할 것. 복잡한 명령은 sh -c '...'로 감싼다.

grep과 색상을 함께 쓰기

watch --color -n 1 "grep --color=always -nE '(ERROR|WARN)' /var/log/app.log | tail -n 20"
  • watch --color는 grep --color=always와 짝을 지어야 한다.
  • tail로 출력을 잘라 화면이 읽을 만한 상태를 유지한다.

바로 쓰는 레시피

# 1) 실시간 에러 카운터 (스냅샷)
watch -n 2 "grep -cE 'ERROR|CRITICAL' /var/log/myapp.log"

# 2) HTTP 상태 코드 분포 (Nginx/Apache)
watch -d -n 2 "awk '{print \$9}' /var/log/nginx/access.log \
 | grep -E '^[1-5][0-9]{2}$' | sort | uniq -c | sort -nr | head"

# 3) 상위 유발자 (예: 앱 로그의 user/service 키)
watch -d -n 3 "grep -Eo 'user=[^ ]+' app.log | sort | uniq -c | sort -nr | head"

# 4) 여러 파일에서 치명적 오류 스캔 (파일명 포함)
watch --color -n 1 "grep --color=always -HnE '(FATAL|OOM|panic)' /var/log/*.log | tail -n 30"

# 5) "최근 1분" 맥박 (systemd 저널)
watch -n 5 "journalctl -u myservice --since '-1 min' --no-pager | grep -cE '(ERROR|WARN)'"

따옴표와 셸 함정

  • $()와 *가 확장되게 하려면 명령 전체를 큰따옴표로 감싼다.
  • 정규식을 셸이 건드리지 않게 하려면 작은따옴표를 쓴다.
  • 따옴표를 안전하게 처리하려면 sh -c로 감싼다:

    watch -n 1 sh -c 'grep --color=always -nE "(ERROR|WARN)" "$0" | tail -n 20' /var/log/app.log
    

watch를 쓰지 말아야 할 때

  • 새 줄을 스트리밍해야 할 때 → 다음을 쓴다:

    tail -F /var/log/app.log | grep --line-buffered -nE '(ERROR|WARN)'
    
  • 알림이나 이력 저장이 필요할 때 → 화면 스냅샷 대신 로그 수집/모니터링 스택(예: journald + Prometheus + Loki)을 쓴다.