리눅스 watch 명령어 사용법 - 상태 변화를 주기적으로 지켜보기
이 명령어를 언제 쓰는가
배포를 올리고 나서 커넥션 수가 정상 범위로 돌아오는지, 배치가 만드는 파일 개수가 늘고 있는지, 디스크가 계속 차는지를 지켜봐야 할 때가 있다. 이럴 때 ss -s를 손으로 열 번 치는 대신 watch에 맡긴다.
watch는 지정한 간격으로 명령을 다시 실행하고, 결과를 화면 맨 위부터 다시 그린다. 스크롤이 흐르지 않으니 숫자가 어떻게 변하는지에만 집중할 수 있다. tail -f가 흘러가는 로그를 보는 도구라면 watch는 고정된 상태값의 변화를 보는 도구다.
Debian·Ubuntu에서는 procps, RHEL·Rocky에서는 procps-ng 패키지에 들어 있어 대개 기본 설치돼 있다. macOS에는 없으므로 brew install watch로 따로 넣어야 한다.
기본 형식
watch [옵션] 명령 [인자...]
- 옵션 — 간격(
-n), 변화 강조(-d), 헤더 제거(-t) 등을 준다. - 명령 — 파이프나 리다이렉션, 변수 확장이 들어가면 반드시 작은따옴표로 감싼다. 감싸지 않으면 셸이 먼저 해석해 버려서 watch가 아니라 watch의 출력이 파이프를 타게 된다.
기본 간격은 2초다. 종료는 Ctrl+C다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
-n 초 | 실행 간격. 소수점도 된다 | watch -n 1 uptime |
-d | 직전 출력과 달라진 부분을 반전 표시 | watch -d free -m |
-d=cumulative | 한 번이라도 바뀐 곳을 계속 표시 | watch -d=cumulative ls -l /tmp |
-t | 상단 헤더(간격·호스트명·시각)를 숨긴다 | watch -t date |
-c | ANSI 색상 코드를 색으로 해석 | watch -c 'systemctl status nginx' |
-g | 출력이 바뀌면 watch를 종료한다 | watch -g 'ls /var/lib/deploy' |
-e | 명령이 실패하면 화면을 멈추고 대기 | watch -e ./healthcheck.sh |
-p | 실행 시간을 빼고 정확한 주기를 지킨다 | watch -p -n 10 ./probe.sh |
-x | 셸을 거치지 않고 직접 exec 한다 | watch -x ls -l /var/log |
실전 예제
1) 소켓 상태 요약을 1초마다 본다. 배포 직후 커넥션이 몰리는지, TIME-WAIT가 쌓이는지 가장 먼저 보는 화면이다.
watch -n 1 'ss -s'
따옴표를 빼도 이 경우엔 동작하지만, 뒤에 파이프를 붙이는 순간 깨진다. 처음부터 감싸는 습관을 들이는 편이 낫다.
2) 특정 포트의 연결 개수만 세서 변화를 강조한다. 커넥션 누수를 의심할 때 쓴다. -d 덕분에 숫자가 바뀐 줄만 반전돼 보인다.
watch -d -n 2 'ss -tn state established "( dport = :3306 or sport = :3306 )" | wc -l'
3) 디스크가 차오르는 속도를 확인한다. 대용량 덤프를 돌리는 중에 /backup이 버틸지 판단하는 용도다.
watch -d -n 5 'df -h /backup; echo; du -sh /backup/*.sql 2>/dev/null | tail -5'
4) 서비스가 살아날 때까지 지켜보다가 자동으로 빠져나온다. -g는 출력이 처음으로 바뀌는 순간 watch를 종료시킨다. 재기동 대기 스크립트에 쓸 만하다.
watch -g -n 2 'systemctl is-active myapp'
echo "상태가 바뀌었다"
5) 헬스체크 응답 코드를 반복 확인한다. 헤더를 지우고(-t) 화면을 깔끔하게 쓴다.
watch -t -n 1 'curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" http://127.0.0.1:8080/health'
6) 큐가 줄어드는지 본다. 워커가 실제로 일을 하고 있는지 확인하는 가장 빠른 방법이다.
watch -d -n 3 'ls -1 /var/spool/jobs/pending | wc -l'
함정과 주의점
따옴표를 빼먹으면 파이프가 watch에 걸린다. watch ls /var/log | grep err 는 ls를 반복 실행한 뒤 그 화면 출력을 grep에 넘긴다는 뜻이 되어 화면이 아무것도 안 나오고 멈춘 것처럼 보인다. 의도한 것은 watch 'ls /var/log | grep err' 다. 리다이렉션(>), 세미콜론, $변수도 전부 마찬가지다.
watch는 셸 별칭과 함수를 모르는 경우가 있다. watch는 명령을 sh -c로 실행한다. 대화형 bash에만 정의된 alias나 함수는 여기서 보이지 않아 command not found가 뜬다. 별칭을 풀어서 전체 명령으로 쓰거나, 스크립트 파일로 만들어 절대 경로로 부른다.
간격을 너무 짧게 주면 관측 자체가 부하가 된다. watch -n 0.1 'ps aux' 같은 조합은 프로세스가 수천 개인 서버에서 CPU를 눈에 띄게 먹는다. 원인을 찾으러 들어갔다가 부하를 더하는 셈이다. 무거운 명령은 2초 이상으로 잡고, 정말 짧은 주기가 필요하면 vmstat 1처럼 자체적으로 주기 출력을 지원하는 도구를 쓰는 것이 옳다.
출력이 한 화면을 넘으면 잘린다. watch는 스크롤을 지원하지 않아 터미널 높이를 넘는 부분은 그냥 사라진다. head, tail, wc -l로 반드시 줄여서 넘긴다.
중요한 관측을 watch로 대신하지 마라. watch는 사람이 보고 있을 때만 의미가 있고 기록이 남지 않는다. 지표를 남겨야 한다면 while true; do date; 명령; sleep 5; done >> probe.log 형태로 파일에 쌓거나 모니터링 시스템에 넣는다.
함께 보면 좋은 명령어
- tail -f — 흘러가는 로그를 볼 때. watch는 고정된 상태값, tail은 계속 추가되는 텍스트에 쓴다.
- top — CPU·메모리는 watch로 감싸지 말고 자체 갱신 기능이 있는 top을 쓴다.
- ss — watch와 가장 자주 조합되는 명령.
watch -n1 'ss -s'는 기억해 둘 만하다.