각 줄마다 bash 스크립트를 병렬로 실행하는 방법은 무엇입니까? 기본적으로 로그 파일을 추적하고 발견된 각 줄에 대해 아래 예와 같이 백그라운드에서 스크립트를 실행하려고 합니다.
tailf logfile.log | grep 'patternline' | while read line ; do
bash scriptname.sh "$line" & ;
done
위 작업을 다음을 사용하여 수행하는 방법을 알고 싶습니다.매개변수(또는 다른 적절한 방법) 병렬성과 프로세스를 제한하는 방법.
미리 감사드립니다.
답변1
GNU Parallel은 매개변수를 정확하게 인용합니다:
tail -f logfile.log | grep 'patternline' |
parallel bash scriptname.sh
가장 중요한 점은 기본값이 CPU 코어당 프로세스 1개이며 두 병렬 작업의 출력이 혼합되지 않도록 보장한다는 것입니다.
GNU Parallel은 동일한 컴퓨터 또는 SSH를 통해 액세스할 수 있는 여러 컴퓨터에서 작업을 병렬로 쉽게 실행할 수 있게 해주는 범용 병렬 처리기입니다. 종종 for
루프를 대체할 수 있습니다.
4개의 CPU에서 32개의 서로 다른 작업을 실행하려는 경우 병렬화하는 간단한 방법은 각 CPU에서 8개의 작업을 실행하는 것입니다.
대신, GNU Parallel은 작업이 완료되면 새로운 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.
설치하다
배포판에 GNU Parallel이 패키지되어 있지 않으면 루트 액세스 없이 개인 설치를 수행할 수 있습니다. 이 작업은 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/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
xargs
설명서를 읽고 -L
그 안에 있는 및 기호를 찾으 십시오 .-P
tail -f logfile.log | grep 'patternline' |
xargs -P 4 -L 1 bash scriptname.sh
이는 한 번에 최대 4개의 명령 인스턴스를 실행하며( -P 4
), 각 호출은 한 줄의 입력을 사용합니다( -L 1
).
무엇이 실행되는지 보려면 -t
추가 하세요 .xargs