사용중인 스크립트를 병렬화하려고 시도했지만 지금까지 GNU Parallel은 매우 어렵습니다.
2 개의 파일이 있습니다. 하나는 명령을 실행할 호스트를 포함하고 다른 하나는 명령을위한 매개 변수를 가지고 있습니다. 다음은 샘플 데이터입니다.
$ cat workers.host
[email protected]
[email protected]
[email protected]
[email protected]
$ cat paths
/usr/local/jar/x/y/ jarxy
/usr/local/jar/z/y/ jarzy
/usr/local/jar/y/y/ jaryy
/usr/local/far/x/y/ farxy
/usr/local/jaz/z/z/ jazzz
/usr/local/mu/txt/ana/ acc01
/usr/local/jbr/x/y/ accxy
이를 처리하기 위해 다음 스크립트를 사용합니다.
#!/bin/bash
echo "Run this on 192.168.130.10";
DATA=`date +%F`
DDAY=`date +%u`
DOMBAC='nice tar cpzf'
readarray -t hosts < workers.host
len=${#hosts[@]};
processed=0;
while read -r -a line; do
let hostnum=processed%len;
ssh ${hosts[$hostnum]} -i /root/.ssh/id_rsa "$DOMBAC - ${line[0]}" > "/data/backup/$DDAY/${line[1]}_${DATA}_FULL.tgz"
let processed+=1;
done < paths
이것은 잘 작동하지만 기계마다 기계에서 단계별로 처리됩니다. 호스트는 상당히 압도적이며 네트워크는 여기서 문제가되지 않으므로 가능한 한 병렬화하고 싶었습니다. 예를 들어 각 호스트에서 4 개의 tar 명령 인스턴스를 실행하고 ssh를 통한 출력을 적절한 이름의 파일로 파이프합니다. 나는 병렬로 완전히 길을 잃었습니다 --results
--sshloginfile
... 그리고 궁극적으로 달성하려는 것은 각 호스트에서 각각 다른 매개 변수를 사용하여 4 개의 작업을 실행하는 것입니다 (예를 들어 호스트 2가 호스트 1이 이미 한 것을 덮어 쓰지 않도록) . GNU Parallel에서이 작업을 수행 할 수 있습니까?
먼저 한 줄의 입력에서 여러 인수를 추출하는 방법을 알아야합니다.
cat paths | parallel --colsep ' ' echo {2} == {1}
(일부 {2}는 {1}에서 생성 될 수 있습니다. 항상 그런 경우 {= =}을 살펴볼 수 있지만 이는 다른 질문에 대한 이야기입니다.)
원격으로 작업을 실행하려면 다음을 사용하십시오 -S
.
cat paths | parallel --colsep ' ' -S server echo {2} == {1}
원격 서버에서 실행되는 작업 수를 제어하려면 다음을 사용하십시오 -j
.
cat paths | parallel --colsep ' ' -j4 -S server echo {2} == {1}
로컬에 저장된 출력을 얻으려면 다음을 --return --cleanup
사용할 수 있습니다.
cat paths | parallel --return {2} --cleanup --colsep ' ' -j4 -S server echo {2} == {1} '>' {2}
출력을 다른 디렉토리에 로컬로 저장하려면 /./ 트릭을 사용해야합니다.
cat paths | parallel --return my/local/dir/./{2} --cleanup --colsep ' ' -j4 -S server echo {2} == {1} '>' {2}
특수 ssh
명령을 사용하려면 --ssh
다음을 사용하십시오 .
parallel --ssh "ssh -i $HOME/.ssh/id_rsa.pub -lroot" --return {2} --cleanup --colsep ' ' -j4 -S server echo {2} == {1} '>' {2}
여러 서버에서 실행하려면 --slf
대신 사용하십시오 -S
.
parallel --slf hosts.txt --ssh "ssh -i $HOME/.ssh/id_rsa.pub -lroot" --return {2} --cleanup --colsep ' ' -j4 echo {2} == {1} '>' {2}
따라서 전체적으로 명령은 다음과 같이 보일 수 있습니다.
parallel --slf hosts.txt --ssh "ssh -i $HOME/.ssh/id_rsa.pub -lroot" --return /data/backup/$DDAY/./{2}_${DATA}_FULL.tgz --cleanup --colsep ' ' -j4 "$DOMBAC - {1} > {2}_${DATA}_FULL.tgz"
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다