Bash에서 멀티스레드하는 방법?

Bash에서 멀티스레드하는 방법?
#!/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 코어당 하나의 작업이 실행됩니다. 이는 -j2020개의 병렬 작업에 맞게 확장될 수 있습니다.

- 솔루션 과 달리 xargs출력을 사후 처리할 수 있습니다. 출력이 직렬화되므로 두 작업의 혼합 출력이 표시되지 않습니다.

GNU Parallel은 동일한 컴퓨터 또는 SSH를 통해 액세스할 수 있는 여러 컴퓨터에서 작업을 병렬로 쉽게 실행할 수 있게 해주는 범용 병렬 처리기입니다.

4개의 CPU에서 32개의 서로 다른 작업을 실행하려는 경우 병렬화하는 간단한 방법은 각 CPU에서 8개의 작업을 실행하는 것입니다.

간단한 스케줄링

대신, GNU Parallel은 작업이 완료되면 새로운 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.

GNU 병렬 스케줄링

설치하다

보안상의 이유로 패키지 관리자를 사용하여 설치하는 것이 좋습니다. 하지만 그렇게 할 수 없다면 이 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더 나은 선택 이지만 xargswhile 루프를 사용하여 이 작업을 수행하는 방법을 보여주기 위해 두 가지 주요 옵션이 있습니다.

하다모든 것동시에:

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

두 번째는 한 프로세스 완료와 두 번째 완료 사이에 데드 타임이 있기 때문에 덜 이상적이며 프로세스를 더 추가할수록 이 문제는 더욱 악화됩니다. 셸에서 문제를 해결하려고 시도할 수 있지만 이미 존재하므로 xargsparallel의미가 없습니다.

관련 정보