사용하고 있는 배치 프로그램 중에 15,000개쯤 되는 항목을 검색하고, 각각의 결과를 파일로 남기는 게 있습니다. 보통은 밤 중에 돌아서 오전에 확인하곤 하는데, 오늘은 무슨 문제가 있었는지, 전체를 돌지 못하고 중간에서 멈춰있었습니다. 그래서 어쩔 수 없이 오전부터 다시 돌리는데, 진행상황을 확인하고 싶었습니다.
전체 항목 수는 알고 있고, 각각의 결과를 파일로 남겨두기 때문에, 결과 파일 수만 세보면 진행상황을 파악할 수 있겠다 싶었습니다. 그래서 다음과 같이 파일 갯수를 셌습니다.
$ find ./ -name '*.log' | wc -l
그리고 저걸 계속해서 전송할 수는 없으니, 주기적으로 명령을 날려 결과를 확인할 수 있도록 "watch"를 추가했습니다.
$ watch -n 10 find ./ -name '*.*' | wc -l
이제 10초마다 진행된 결과를 확인할 수 있겠다 싶었는데, 아무런 반응이 없었습니다.
그래서 10초를 준 것 때문에 그런가? 싶어 빼보기도 했는데, 여전했고, pipe로 연결된 wc -l을 빼고 실행하니 너무나 잘 실행이 되는 것을 확인했습니다.
$ watch find ./ -name '*.log' | wc -l
위에서 알게된 것을 가지고 구글링을 해보니, watch는 첫 번째 커맨드를 반복하므로 pipe 이후의 명령으로 결과가 전달되지 않는다는 것을 알게 되었습니다. 그래서 해결책은 뒤의 커맨드를 하나로 묶어 주면 되었습니다.
# 따옴표로 묶기
$ watch -n 10 "find ./ -name '*.*' | wc -l"
watch는 "다음에 오는 첫 번째 커맨드를 반복해서 실행한다라"는 간단한 원칙만 기억하고 있으면 쉽게 해결할 수 있는 문제였습니다.
참고 : http://tuxtweaks.com/2013/12/linux-watch-command/
Linux watch Command with pipe
The Linux watch command. How to repeat tasks with watch and how to handle pipelined commands.
tuxtweaks.com