xargs 와 간단한 쉘 기반 멀티프로세싱 1부 웹페이지 다운받기

in shell •  7 years ago  (edited)

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 을 이용해서 서버상태를 확인하는 방법을 얘기해볼께요

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!