xargs가 여러 프로세스의 출력을 잘못 병합하는 것을 방지하는 방법은 무엇입니까?

xargs가 여러 프로세스의 출력을 잘못 병합하는 것을 방지하는 방법은 무엇입니까?

저는 xargs해당 옵션 --max-args=0(또는 -P 0)을 사용하고 있습니다.

그러나 프로세스의 출력은 stdout적절한 라인 분리를 고려하지 않고 스트림에 병합됩니다. 그래서 나는 종종 다음과 같은 말을 듣습니다.

<start-of-line-1><line-2><end-of-line-1>

전체 출력 패턴에 with를 사용하면 egrep결과가 엉망이 됩니다.^xargs

xargs프로세스 출력을 순서대로(한 프로세스의 출력이 연속적이라면 어떤 순서든) 강제로 기록할 수 있는 방법이 있습니까 ?

아니면 다른 솔루션?

편집하다:사용 사례에 대한 자세한 내용:

다른 호스트에서 웹페이지를 다운로드하고 구문 분석하고 싶습니다. 각 페이지를 로드하는 데 약 1초가 걸리고 수십 개의 페이지가 있으므로 요청을 병렬화하고 싶습니다.

내 명령의 형식은 다음과 같습니다.

echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'

호스트 IP($IPs 변수)와 일부 기타 데이터가 포함된 bash 파일에서 오기 때문에 Perl과 같은 것보다는 bash를 사용하고 있습니다.

답변1

GNU Parallel은 이 문제를 해결하기 위해 특별히 설계되었습니다.

echo -n $IPs | parallel -d ' ' -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'

IP가 파일에 있으면 더욱 아름답습니다.

cat IPs | parallel -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'

자세히 알아보려면 소개 동영상을 시청하세요.http://www.youtube.com/watch?v=OpaiGYxkSuQ

답변2

이렇게 하면 트릭을 수행할 수 있습니다.

echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
  sh -c "wget -q -O- 'http://{}/somepage.html' | egrep --count '^string'" | \
  { NUM=0; while read i; do NUM=$(($NUM + $i)); done; echo $NUM; }

여기서 아이디어는 별도의 계산을 만들어 마지막에 합산하는 것입니다. 개별 개수가 혼합할 수 있을 만큼 큰 경우 이 작업이 실패할 수 있지만, 그렇지 않아야 합니다.

관련 정보