1

bash 스크립트를 쉽게 병렬 처리 할 수 ​​있도록이 함수를 사용하려고합니다. 아이디어는 간단합니다. 각 명령을 순차적으로 실행하는 대신,이 함수로 실행하려는 명령을 파이프 처리하고 행을 읽는 동안 수행합니다. 나를 위해 bg에서 작업을 실행하고 물류 .... 돌봐 그것은 작동하지 않습니다. 나는 물건을 처형 한 곳에서 set -x를 추가했고, 내가 처형을 원하는 물건 주위에 이상한 따옴표가 나타나는 것처럼 보였다. 어떻게해야합니까? 내가 그것을 실행하면bash - 명령을 파이프하여 함수를 분리하여 실행하려고 시도했습니다.

runParallel() { 
    while read line 
    do 
     while [ "`jobs | wc -l`" -eq 8 ] 
     do 
      sleep 2 
     done 

     { 
      set -x 
      ${line} 
      set +x 
     } & 
    done 

    while [ "`jobs | wc -l`" -gt 0 ] 
    do 
     sleep 1 
     jobs >/dev/null 2>/dev/null 
     echo sleeping 
    done 
} 

for H in `ypcat hosts | grep fmez | grep -v mgmt | cut -d\ -f2 | sort -u` 
do 
    echo 'ping -q -c3 $H 2>/dev/null 1>/dev/null && echo $H - UP || echo $H - DOWN' 
done | runParallel 

, 나는 다음과 같은 출력을 얻을 : 내가 올바르게 이해 해요 경우

> ./myscript.sh 
+ ping -q -c3 '$H' '2>/dev/null' '1>/dev/null' '&&' echo '$H' - UP '||' echo '$H' - DOWN 
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline] 
      [-p pattern] [-s packetsize] [-t ttl] [-I interface or address] 
      [-M mtu discovery hint] [-S sndbuf] 
      [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination 
+ set +x 
sleeping 
> 
+0

make 할 때 무엇이 ​​잘못 되었나요? –

답변

1

set -x 출력의 인용은 대부분에 그들이 문제의 또 다른 결과이다, 문제가되지 않습니다. 주된 문제는 ${line}eval ${line}과 같지 않다는 것입니다.

변수가 확장되면 결과 단어는 쉘 예약 구문으로 처리되지 않습니다. 그리고 이것은 예상되는 것입니다.

A="some text containing > ; && and other weird stuff" 
echo $A 

잘못된 구문에 대해 소리 치지 않지만 변수 값을 인쇄합니다.

그러나이 함수에서이 2>/dev/null 등을 포함 ${line}, 모든 단어, set -x 출력이 잘 보여주고, 그래서 ping이 불만을 핑 (ping)에 인수로 전달되는 것을 의미한다.

리디렉션과 조건부로 복잡한 변수 명령 줄에서 변수를 실행하려면 eval을 사용해야합니다.

+0

정말 대단합니다. 에코 (echo) 된 텍스트 주위에 큰 따옴표를 넣으면 eval이 작동합니다. 감사! – a8ksh4

1

, 당신은 아마 당신의 echo 명령에 작은 따옴표를 원하지 않는다. 작은 따옴표는 리터럴 문자열이며 bash 변수 $ H를 해석하지 않습니다.

1

GNU 병렬의 많은 사용자와 마찬가지로 자신 만의 병렬 프로그램을 작성한 것처럼 보입니다. 당신이 GNU 병렬 http://www.gnu.org/software/parallel/ 설치 당신이 할 수있는 경우

:

cat hosts | parallel -j8 'ping -q -c3 {} 2>/dev/null 1>/dev/null && echo {} - UP || echo {} - DOWN' 

당신은 GNU 병렬를 설치할 수 있습니다 단순히 기준 :

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

시계 GNU 병렬에 대한 소개 동영상을 더 배울 수 : 를 https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

관련 문제