다중 작업 동시 동시 제어에서는 mkfifo 리눅스 쉘 - 사용

기본적으로 스크립트에서 쉘 명령은 직렬 실행 후 명령을 실행하기 전에 대기에 다음 명령을 실행해야한다는 것입니다,하지만 난 많은 수의 명령의 경우이있는 경우 실행하고, 다른 상황에 영향을주지 않습니다 (더 복잡 영향력있는 경우), 당신은 동시에 실행 명령을 사용합니다.

으로는 다음과 같습니다 :

#! / 빈 / bash는 
IPLIST = / 가정 / 메타 / ipinfo / iplist
 에 대한에서 $ ( 고양이 $ {IPLIST} | 그렙 -viE " ^ # |备机| TS " | AWK는  ' {$ 1 인쇄} ' )
 
SSH $ 내가 " CD ~ / 업데이트 / 타르 zxf 패치 20160909.tgz -C ~ / LMDG / && 에코 '/ $ 난 괜찮아'|| 에코 '/ $ 내가 나쁜' " 
 >> 의 Result.txt 

에코  " resutl " | 똥개 -a의 Result.txt -s 갱신 결과 메타 @ 126 .COM

 

iplist IP가 많이 있기 때문에 나는 동시 프로그래밍을 사용하려면, 그래서 위의 코드를 들어, 각 "타르 zxf"는 많은 시간을 절약 할 수 그래서, 시간이 많이 걸리는 걸.

다음과 같이 개정 :

#! / 빈 / bash는 
IPLIST = / 가정 / 메타 / ipinfo / iplist
 에 대한에서 $ ( 고양이 $ {IPLIST} | 그렙 -viE " ^ # |备机| TS " | AWK는  ' {$ 1 인쇄} ' )
 
SSH 나는 $ " 타르 zxf 패치 20160909.tgz -C ~ / LMDG / && 에코 '/ $ 난 괜찮아'|| 에코 '/ $ 내가 나쁜'CD ~ / 업데이트 / " &
 완료 >> 의 Result.txt 

에코  " resutl을 " | 똥개 -a의 Result.txt -s 갱신 결과 메타 @ 126 .COM

 

플러스 "&" "타르 zxf"후 병렬로 실행할 수 있습니다. 본질적으로, 실행의 백그라운드 프로세스로 "타르 zxf은"그래서 명령은 현재 배쉬을 차지하지 않습니다, 다른 명령은 계속 이전 명령의 완료를 기다릴 필요가 없으며, 그렇게 달성하기 위해 배경에 여러 작업에 배치 할 수 있습니다 동시 다중 작업.

나는 루프의 끝을 실행 한 다음 "똥개"결과 앞에서 한 후 목표는 "타르 zxf"이다 가정되었다. 위, 다음, (가) "타르 zxf는"이상 이미 "똥개"를 시작하고, 잘못된 결과를 얻을하지 않을 때처럼 작성하는 경우, 다음과 같은 변경을 할 필요가있다 :

#! / 빈 / bash는 
IPLIST = / 가정 / 메타 / ipinfo / iplist
 에 대한에서 $ ( 고양이 $ {IPLIST} | 그렙 -viE " ^ # |备机| TS " | AWK는  ' {$ 1 인쇄} ' )
 
SSH $ 내가 " CD ~ / 업데이트 / 타르 zxf 패치 20160909.tgz -C ~ / LMDG / && 에코 '/ $ 난 괜찮아'|| 에코 '/ $ 내가 나쁜' " &
 완료 >> 의 Result.txt
 기다릴 
에코  " resutl " | 똥개 -a의 Result.txt -s 갱신 결과 메타 @ 126 .COM

 

여기에서 우리는 우리가 원하는 결과를 얻을 수있는 "대기"를 추가하고, 아이가 작업이 상위 타스크의 말에 완료 수행 한 후 다음 작업을 수행하는 대기의 영향 후 대기입니다.

그러나,이 iplist 거대한 양, 그래서 배경으로 숨 경우 우리는 동시성 제어 메커니즘의 번호가 필요하므로, 시스템 부하가 초과, 다운 타임이나 성능 저하의 위험이있을 것이다, 또 다른 질문 하였다.
따라서, 우리는 작업 큐의 개념을 도입, 소켓 예는 생산자 모델 전에 소비자에게 다소 유사하다, 메시지 큐를 통해 수요와 공급의 불균형을 조절하기 위해
다음과 같이 개정 :

#! / 빈 / bash는 

IPLIST = / 홈 / 메타 / ipinfo / IPLIST # 작업 (소비자) 
THREAD = 50 개 동시 스레드 작업 파이프의 최대 수를 설정하는 동시 # 문의 수, 이것이이 응용 프로그램의 열쇠입니다 
TMPFIFO을 = # 문 파이프 이름 /tmp/$$.fifo, ' $$는 ' 프로세스가 현재 스크립트 PID 실행되고 있음을 나타냅니다
 에서는 mkfifo $ TMPFIFO # 파이프 라인을 만들 
Exec에서 5 <> $ {TMPFIFO} # 파일 식별자 "를 만들 5 "이 그림과 같이 할 수있다 "뿐만 아니라 0 ", " 1 ", " 모든 문자를 선언하지 않은 외부", 도관의 동작 모드는 읽기 및 쓰기 파일, 간부 시스템 호출은 원래의 과정을 대체 할 새로운 프로세스이지만, 프로세스가 PID 남아 변화, 바꾸어 말하면, 호출 처리가 실행 파일 내에서 실행된다
 RM - RF # $ {삭제} TMPFIFO 파이프 작성된 파일 

의 동일한 수를 생성하기 # 동시 스레드 자리 
에 대해 ((I는 = 1. ; I <= $ 스레드, I ++ ))
않는 
에코는 , 
그 하나의 스레드 만 각 라인의 자리를 보장하기 위해 # 빌려 읽기 명령을 라인의 특성을 읽고, 기본 출력이 줄 바꿈 에코 사용하여 여기에 생산자의 연상소비자 모델, 파이프 라인 파일은 메시지 큐의 역할 기록 소비자의 수요에 다음 생산자에 의해 작업을 선택하고 작업, 비동기 디커플링을 사용하여 여기에 아이디어를 완료합니다.
DONE > & 5.  
# 라이트 파이프 위치 정보에 

대한 I 에서 $ ( CAT $ IPLIST {} | 그렙 -viE " ^ # | 대기 기계 | TS " | AWK  ' {} 1 인쇄 $. " ) 작업 대기열 번호부터 순차적 작업을 읽을
 
읽기 - U5 
파이프에서 # 파일 기술자를, 파이프 스레드가 자리를 얻을 다음 작업을 수행하기 시작 읽기 - 유 fd와 함께 다시, 그 파일 기술자가 될 수있는 파일 기술자에서 읽어냅니다 간부 새로 열었습니다. 
{ 
에코 $ ( CAT ~ / ipinfo / IPLIST |그렙 $ I | AWK  ' {} 2 $ 인쇄 ' );
 SSH -oConnectTimeout = 10 -oConnectionAttempts = . 3 $ I " CD / 홈 / 로그 /; 그렙 'MIL'mission_2016-08-03 * .LOG | AWK의 -F ' | 'IF {(\ == $ (1370) 19) \ $ 0 인쇄} 
된 awk , -F를 ' {IF는 $ 0 \ 인쇄 (\ $ 20 == 0)} '이 > miss_info.txt "
 에코  " " > & . (5)  
작업이 완료 # fd5 항상 스레드의 수 (50)가 될 파이프 라인을 유지 한 후이 스레드의 구현 후, 스레드가 자리를 유지하고 있는지 확인하고, 자리 표시 자에 작성 및 명령 /의 부분을 나타내는 현재 bash는 고려하지 않습니다 배경으로 작업을 병렬 처리를 달성하기 
} &
DONE 
대기 자식 프로세스의 부모에 대한 # 대기는 상위 프로세스의 마지막 종료 후 실행 
Exec을 5 > & -# 닫기 fd5 파이프 라인 
종료 0

 

----------------
면책 조항 :이 문서는 CSDN 블로거에 원래 문서의 "바이 진무 필드"에 의해-SA 저작권 계약, 복제, 원본이 링크를 첨부하시기 바랍니다 CC 4.0에 따라 문.
원본 링크 : HTTPS : //blog.csdn.net/qq_34409701/article/details/52488964

추천

출처www.cnblogs.com/cangqinglang/p/12105399.html