조금 배우고 있어요불다사용하여매개변수여러 IP 주소에 대한 whois 레코드를 나열합니다. 사용된 명령은 다음과 같습니다:
echo "$1" | tr "\n" "\0" | xargs -0 -n 1 -t -P 3 -I % sh -c 'echo "\n 44rBegin whois record -- \n"; whois -h whois.arin.net % ; echo "\n 44rEnd whois record -- \n"'
실행되는 명령은 다음과 같습니다:
sh -c echo "\n 44rBegin whois record -- \n"; whois -h whois.arin.net 206.190.36.45 ; echo "\n 44rEnd whois record -- \n"
sh -c echo "\n 44rBegin whois record -- \n"; whois -h whois.arin.net 212.146.69.237 ; echo "\n 44rEnd whois record -- \n"
sh -c echo "\n 44rBegin whois record -- \n"; whois -h whois.arin.net 77.238.184.24 ; echo "\n 44rEnd whois record -- \n"
sh -c
나는 실행을 사용하여 명령의 각 블록이 순서대로 실행된 것처럼 출력을 원합니다 . 대신 내 결과는 다음과 같습니다.
44rBegin whois record
44rBegin whois record
44rBegin whois record
whois1 output
44rEnd whois record --
whois2 output
44rEnd whois record --
whois3 output
44rEnd whois record --
이 문제를 어떻게 해결할 수 있나요?
답변1
이 특정한 경우 -P 3
에는 xargs
.
-P max-procs
Run up to max-procs processes at a time; the default is 1. If max-procs is
0, xargs will run as many processes as possible at a time. Use the -n op‐
tion with -P; otherwise chances are that only one exec will be done.
병렬로 실행하기 때문에 모두 동시에 출력에 씁니다.
이 명령을 다른 곳에서 복사한 경우 조사하여 복사하는 내용을 이해하는 것이 좋습니다. 그렇지 않으면 위험할 수 있습니다.
답변2
write
여러 프로세스가 동일한 터미널(또는 파일)에 병렬로 출력될 때마다 해당 출력이 분산될 위험이 있습니다(일종의 잠금을 준비하거나 열린 파일 추가 와 같은 저수준 시스템 호출을 사용하지 않는 한 ). 모델).
첫 번째 단계로, 각 쉘 호출에서 다음을 사용하여 이를 수행할 수 있습니다.명령 대체: whois
명령을 하위 프로세스로 실행하고, 해당 출력을 캡처하고, 모든 것을 단일 printf
작업으로 결합합니다.
xargs -0 -n 1 -P 3 -I %% sh -c 'printf "\n%s\n%s\n%s\n" " 44rBegin whois record -- " "$(whois -h whois.arin.net %%)" " 44rEnd whois record -- "'
flock
더 좋은 점은 사용 가능한 프로그램이 있는 경우 이를 사용하여 다음 조합에 대한 모든 호출을 잠글 수 있다는 것입니다 printf
.
xargs -0 -n 1 -P 3 -I %% sh -c 'who="$(whois -h whois.arin.net %%)"; flock /tmp/who.lock printf "\n%s\n%s\n%s\n" " 44rBegin whois record -- " "$who" " 44rEnd whois record -- "'
답변3
네, 그로 인해 출력이 혼합됩니다 xargs -P
. 여러 하위 프로세스를 병렬로 실행하고 있으며 출력을 조정하는 것은 없습니다. 원할 때 모두 출력을 작성하고 모두 함께 혼합됩니다.
사용GNU 병렬, 이는 동일한 작업을 수행하는 보다 강력한 도구입니다 xargs -P
. 기본값은 다음과 같습니다.각 작업의 결과를 그룹화.
echo "$1" | parallel -t -P 3 sh -c 'echo "\n 44rBegin whois record -- \n"; whois -h whois.arin.net $0; echo "\n 44rEnd whois record -- \n"'
답변4
이 문제를 어떻게 해결할 수 있나요?
cat
이 기술을 보여주기 위해 표준 출력을 각 프로세스 및 이후의 모든 프로세스에 대한 파일로 리디렉션합니다.
seq 100 | sort -R |
xargs -I@ -P0 sh -c '{ echo begin @ && sleep 0.@ && echo end @; } > $$.log' &&
find . -name '*.log' -exec cat {} \+
이 기술을 명령에 적용하십시오.
echo "$1" |
tr "\n" "\0" |
xargs -0 -n 1 -t -P 3 -I % sh -c '{echo "\n 44rBegin whois record -- \n"; whois -h whois.arin.net % ; echo "\n 44rEnd whois record -- \n";} > $$.log' &&
find . -name '*.log' -exec cat {} \+