• All Objects
    • Life
    • Technic
    • entry
  • Tags
  • git
  • wsl2
  • docker
  • github
  • go
Technic

watch가 연결된(pipe) 명령을 실행하지 못할 때.

2020. 8. 6. 23:33

 

사용하고 있는 배치 프로그램 중에 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

 

반응형
copyright 2020. noname

티스토리툴바