xargs 는 다양한 용도로 사용할 수 있는데 특히 멀티 프로세싱 큐 기능에 대해서는 의외로 모르는 분들이 많으셔서, 간단히 소개해보도록 하겠습니다.
오늘은 1부 웹페이지 다운받기 입니다.
xargs 를 이용한 멀티 프로세싱의 핵심은 "-P" 옵션입니다.
먼저 간단하고 실용적인 예제를 만들어 보겠습니다.
웹페이지 다운받기 1
다음처럼 input.txt
파일에 다음처럼 다운 받을 URL을 한줄에 하나씩 넣습니다.
cat << ENDL > input.txt
google.com
http://qgp9.github.io/blog/2015/07/11/Free-Servers
http://qgp9.github.io/blog/2015/07/09/John-8-7
http://qgp9.github.io/blog/2015/05/30/Windstruck
http://qgp9.github.io/blog/2015/05/06/Craig-Remark-01
ENDL
그리고 xargs
에 옵션 -P4
를 주어서 4개의 멀티 프로세싱 큐를 만들어줍니다.
cat input.txt | xargs -I% -P4 wget "%"
짜잔~ , 이제 input.txt
의 URL 들은 동시에 4개씩 다운받아집니다. 아마 원래의 순서와 출력 순서가 봐뀌어서 출력된 것이 보일겁니다. while 문이나 -P 옵션 없이 다운로드하는 것 보다 대부분의 경우 2~4배 정도 빨라집니다.
이게 끝입니다. 참 간단하죠?
웹페이지 다운받기 2
이제 약간만 응용해 볼까요? 이번엔 제가 실제로 사용했던 예를 들어보죠.
창조과학회(창조과학소설회)의 글을 반박하기 위한 데이터베이스를 만들기 위해 사전작업으로 웹페이지를 다운받아봅시다.
다행히 글들이 일련번호 순으로 되어있어 간단하네요
다운로드는 한 10개 정도 큐를 만들어봅시다. ( 어차피 네트웤이 병목이라 늘려도 한계가 있고, 또 너무 늘리면 방화벽이 차단할 가능성도 있습니다. )
seq 1 100 | xargs -I% -P10 wget -q "http://www.kacr.or.kr/library/itemview.asp?no=%" -O %.html
오~ 28초, 큐가 하나인 경우( -P1
) 보다 딱 10배 빠르군요.
하지만 진행상황이 나오지 않으니 답답하죠? wget
에 진행중인 URL 을 출력하는 옵션이 있겠지만 간단히 echo
로 해결해봅시다. xargs
에 간단한 명령어 조합을 사용할땐 bash -c
가 유용합니다.
seq 10 20 | xargs -I% -P1 bash -c "echo %;wget -q 'http://www.kacr.or.kr/library/itemview.asp?no=%' -O %.html"
물론 제가 진짜로 사용했던 스크립트는 더 복잡하지만, 이 정도도 자주 씁니다.
2부에선 xargs 와 ping 을 이용해서 서버상태를 확인하는 방법을 얘기해볼께요