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


17

xargs옵션과 함께 사용 하고 있습니다 --max-args=0(또는 -P 0).

그러나 공정의 출력은 stdout적절한 라인 분리를 고려하지 않고 스트림으로 병합됩니다 . 그래서 종종 다음과 같은 줄로 끝납니다.

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

전체 출력 에서 패턴을 사용 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를 사용합니다.


질문에 대한 더 완전한 예를 들어 줄 수 있습니까? 현재 어떻게 또는 왜 사용하고 있는지 명확하지 않습니다 xargs.
Caleb

이것에 대한 해결책은 힘들 것입니다. 각 프로세스의 표준 출력에 대해 다른 파일 설명자를 사용해야하며 작은 서버를 사용하여 라인을 수집해야합니다. xargs그런 기능을 제공하지 않는 것 같습니다.
Stéphane Gimenez

@Caleb 당신이 간다, 이것이 도움이되기를 바랍니다 :-)
Christoph Wurm

분명히 가벼운 솔루션은 아니지만 아마도 make작업 기능을 사용할 수 있습니다 make. 출력 라인을 올바르게 병합 한다고 생각 합니다.
Stéphane Gimenez

도움 --line-bufferedegrep주기 위해 깃발을 추가합니다
iruvar

답변:


6

트릭을 수행해야합니다.

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; }

여기서 아이디어는 별도의 수를 세어 마지막에 합산하는 것입니다. 개별 카운트가 혼합 될만큼 충분히 크면 실패 할 수 있지만, 그렇지 않아야합니다.


14

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
좋은 도구! 또한, 나는 누군가가 고양이가 곧 쓸모 없다고 말할 것이라고 내기하고 있습니다.
Stéphane Gimenez

1
알아. 그러나 읽기가 더 쉬우 며 보통 48 개의 코어 시스템에서 작업하므로 유휴 코어 중 하나에 대한 몇 가지 추가 클럭 사이클은 아직 문제가되지 않았습니다.
Ole Tange

병렬 작업은 데비안 저장소에 있으면 작업에 적합합니다.
Christoph Wurm

1
@Legate Debian에는 moreutils의 parallel명령이 포함되어 있으며 여기에 충분합니다.parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs
Gilles 'SO-stop

.deb 파일의 경우 @Legate checkout build.opensuse.org/package/… 및 버그를 푸시하려면 bugs.debian.org/cgi-bin/bugreport.cgi?bug=518696
Ole Tange
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.