#!/bin/bash
while IFS="," read ip port; do
ruby test.rb "http://$ip:$port/"&
ruby test.rb "https://$ip:$port/";
done <test1.txt
멀티스레드에서는 어떻게 해야 합니까? &로 나누어 더 많은 줄을 수행하면 동일한 IP와 포트를 사용하여 동일한 명령을 여러 번 실행하고 다음 IP와 포트를 사용하여 실행하고 싶습니다. 또한 동일한 파일은 192.168.1.2,8089 처럼 보입니다.
답변1
나는 이렇게 할 것이다:
parallel --colsep , ruby test.rb {3}://{1}:{2}/ :::: ipport.txt ::: http https
기본적으로 CPU 코어당 하나의 작업이 실행됩니다. 이는 -j20
20개의 병렬 작업에 맞게 확장될 수 있습니다.
- 솔루션 과 달리 xargs
출력을 사후 처리할 수 있습니다. 출력이 직렬화되므로 두 작업의 혼합 출력이 표시되지 않습니다.
GNU Parallel은 동일한 컴퓨터 또는 SSH를 통해 액세스할 수 있는 여러 컴퓨터에서 작업을 병렬로 쉽게 실행할 수 있게 해주는 범용 병렬 처리기입니다.
4개의 CPU에서 32개의 서로 다른 작업을 실행하려는 경우 병렬화하는 간단한 방법은 각 CPU에서 8개의 작업을 실행하는 것입니다.
대신, GNU Parallel은 작업이 완료되면 새로운 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.
설치하다
보안상의 이유로 패키지 관리자를 사용하여 설치하는 것이 좋습니다. 하지만 그렇게 할 수 없다면 이 10초 설치를 사용할 수 있습니다.
10초 설치는 전체 설치를 시도하고, 실패하면 개인 설치를 수행하고, 실패하면 최소 설치를 수행합니다.
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a
12345678 883c667e 01eed62f 975ad28b 6d50e22a
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
cc21b4c9 43fd03e9 3ae1ae49 e28573c0
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
$ bash install.sh
다른 설치 옵션은 다음을 참조하세요.http://git.savannah.gnu.org/cgit/parallel.git/tree/README
더 알아보기
치트 시트 다운로드:http://www.gnu.org/s/parallel/parallel_cheat.pdf
더 많은 예시 보기:http://www.gnu.org/software/parallel/man.html
소개 비디오 보기:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
이 튜토리얼을 살펴보세요:http://www.gnu.org/software/parallel/parallel_tutorial.html
지원을 받으려면 이메일 목록에 가입하세요.https://lists.gnu.org/mailman/listinfo/parallel
답변2
tr ',' ':' <test1.txt | xargs -P 4 -I XX ruby test.rb "http://XX/"
test1.txt
파일에 다음과 유사한 줄이 포함되어 있다고 가정합니다 .
127.0.0.1,80
127.0.0.1,8080
그런 다음 tr
다음으로 변경하십시오.
127.0.0.1:80
127.0.0.1:8080
xargs
한 번에 한 줄씩 가져와서 주어진 XX
명령 문자열을 해당 줄의 내용으로 바꾸고 명령을 실행합니다. -P 4
최대 4개의 프로세스를 동시에 실행할 수 있습니다 .
파일의 각 줄에 쉼표가 있는 경우 먼저 쉼표를 제거하세요.
sed 's/,$//' test1.txt | tr ',' ':' | xargs ...as above...
심지어
sed -e 's/,$//' -e 'y/,/:/' test1.txt | xargs ...as above...
답변3
gnu-parallel
더 나은 선택 이지만 xargs
while 루프를 사용하여 이 작업을 수행하는 방법을 보여주기 위해 두 가지 주요 옵션이 있습니다.
하다모든 것동시에:
while IFS="," read ip port; do
ruby test.rb "http://$ip:$port/" <&- &
done <test1.txt
한 번에 2명으로 제한하세요.
while IFS="," read ip port; do
ruby test.rb "http://$ip:$port/" <&- &
IFS=, read ip port || break
ruby test.rb "http://$ip:$port/" <&- &
wait
done <test1.txt
두 번째는 한 프로세스 완료와 두 번째 완료 사이에 데드 타임이 있기 때문에 덜 이상적이며 프로세스를 더 추가할수록 이 문제는 더욱 악화됩니다. 셸에서 문제를 해결하려고 시도할 수 있지만 이미 존재하므로 xargs
별 parallel
의미가 없습니다.