링크 ux 셸 다 중 프로 세 스

6008 단어
1 bash 배경 에서 다 중 프로 세 스 실행
1.1 command & 배경 실행
터미널 명령 줄 을 풀 고 command 명령 프로그램 을 배경 에 걸 어 계속 실행 합 니 다. 그러면 사용 자 는 프로그램 이 끝 난 후에 터미널 명령 줄 을 풀 필요 가 없습니다. command 배경 에서 실행 을 기다 리 면서 다른 일 을 할 수 있 습 니 다.단, 현재 터미널 을 닫 을 수 없습니다. 배경 에 걸 려 있 는 command 명령 은 현재 터미널 에 의존 합 니 다. 현재 터미널 을 닫 으 면 배경 에 있 는 coman 명령 도 실 행 됩 니 다.예 를 들 어 sort 명령 을 사용 하여 큰 파일 을 정렬 합 니 다.
$ sort log > log.sorted &
1.2 nohup command & 백 스테이지 실행
이 방식 은 배경 에서 실행 되 는 command 프로그램 을 nohup 으로 관리 하 는 것 과 차이 가 있 습 니 다.이렇게 하면 백 엔 드 의 command 프로그램 이 터미널 에서 완전히 벗 어 날 수 있 습 니 다. 터미널 이 닫 혔 을 때 백 엔 드 의 command 프로그램 은 nohup 관리 하에 계속 실 행 됩 니 다.시간 이 많이 걸 리 는 프로그램 을 실행 하려 면 배경 프로그램 을 관리 하 는 것 을 권장 합 니 다.프로그램 이 실행 되 는 과정 에서 터미널 이 네트워크 속도 가 불안정 하거나 다른 원인 으로 갑자기 중단 되면 실행 중인 프로그램 이 중단 되 기 때문이다.사용 방법:
$ nohup longtime.sh &

프로그램 실행 과정 에서 의 정상 적 인 출력 과 오류 출력 은 프로그램 디 렉 터 리 의 nohup. out 파일 로 재 설정 되 었 습 니 다.출력 을 재 설정 할 파일 을 다음 과 같이 지정 할 수 있 습 니 다.
$ nohup longtime.sh > myout 2>&1 &

1.3 백 스테이지 작업 다 중 프로 세 스 실현
다 중 프로 세 스 가 필요 한 프로그램 블록 을 모두 command & 배경 으로 옮 겨 실행 하면 됩 니 다.
#!/bin/bash
start=`date +"%s"`
for (( i=0; i<10; i++ ))
do
    {
        echo "multiprocess"
        sleep 3
    } &  #            
done
wait    #        
end=`date +"%s"`
echo "time: " `expr $end - $start`

상기 방식 을 사용 하여 10 회 실행 과정 을 모두 배경 으로 실행 합 니 다.이 방식 은 프로그램의 다 중 프로 세 스 를 동시에 실행 할 수 있 지만 배경 에서 실행 되 는 프로 세 스 수 를 제어 할 수 없습니다.프로 세 스 수 제 어 를 실현 하기 위해 서 는 파이프 와 파일 설명 자 를 사용 해 야 합 니 다.
2 fifo 파이프 로 다 중 프로 세 스 관리
2.1 파이프
파 이 프 는 프로그램 간 의 데이터 공유 에 사용 할 수 있 지만 주의해 야 할 것 은 이런 데이터 공 유 는 단 방향 이다.파 이 프 는 두 가지 로 나 뉘 는데 익명 의 파이프 와 유명한 파이프 로 유명 파이프 만 논의 된다.파이프 의 특징: 1. 파이프 의 양 끝 을 연결 하 는 두 개의 프로그램 이 필요 합 니 다. 한 프로그램 은 파이프 에 데 이 터 를 쓰 고 다른 프로그램 은 파이프 에서 데 이 터 를 가 져 옵 니 다.2. 데 이 터 를 쓰 는 프로그램 만 있 을 때 기록 작업 은 다른 프로그램 이 파이프 에서 데 이 터 를 읽 을 때 까지 차단 상 태 를 처리 합 니 다.마찬가지 로 읽 는 프로그램 만 있 을 때 읽 기 동작 도 계속 막 힌 상태 에 있 습 니 다. 다른 프로그램 이 파이프 에 데 이 터 를 쓸 때 까지 3. 파이프 에 데이터 가 없 을 때 데 이 터 를 가 져 오 는 프로그램 이 막 히 고 데 이 터 를 쓰 는 프로그램 이 파이프 에 데 이 터 를 쓸 때 까지 막 힙 니 다.
유명 파 이 프 는 fifo 라 고 불 리 는 다음 과 같은 특징 이 있 습 니 다. 1. fifo 는 이름 을 가지 고 있 으 며 파일 시스템 에 존재 합 니 다. 2. fifo 양 끝 에 읽 기와 쓰기 프로그램 이 동시에 존재 하지 않 는 한 fifo 의 데이터 흐름 은 3. fifo 는 mkfifo 와 같은 명령 으로 생 성 됩 니 다. 익명 파 이 프 는 셸 이 자동 으로 4. fifo 는 양 방향 바이트 흐름 이 고 데이터 흐름 은 형식 이 없습니다.
2.2 fifo 를 사용 하여 셸 다 중 프로 세 스 관리
직접 코드:
  1 #!/bin/bash
  2 
  3 if [ $# -ne 1 ]
  4 then
  5         echo Usage: split.sh 201610
  6         exit 1
  7 else
  8         month=$1
  9 fi
 10 len=`echo $month | wc -L`
 11 if [ $len != "6" ]
 12 then
 13         echo "err> The lenght of month is not valid ..."
 14 fi
 15 
 16 
 17 fp_out="/opt/log_combine/"
 18 fp_tmp="/opt/log_combine/tmp/"
 19 fp_in="/opt/tag_log/tag.log."
 20 
 21 #            
 22 fns=`ls $fp_in$month*.gz`
 23 if ls $fns >> log.split4month
 24 then
 25         echo "split the log begin!"
 26 else
 27         echo "err> can't find the file $fns"
 28         exit 1
 29 fi
 30 
 31 trap "exec 1000>&-;exec 1000$tmpfifo
 36 rm -fr $tmpfifo
 37 
 38 thread_num=`grep "processor" /proc/cpuinfo | sort -u | wc -l`
 39 
 40 for (( i=0; i&1000
 43 done
 44 
 45 for fn in $fns
 46 do
 47         fn_tmp=${fn##*/}
 48         read -u1000
 49         {
 50                 echo `date` $fn "begin!"
  51                 zcat $fn | gawk -F"\001" 'NF==6{
 52                         if($1~/\./){
 53                                 suf = substr($1, index($1, ".")-1, 1)
 54                         }else{
 55                                 suf = substr($1, length($1))
 56                         }
 57                         
 58                         if(suf~/[0-9a-f]/){
 59                                 print $1"\001"$2"\001"$4"\001"$6 >> "'$fp_tmp$fn_tmp'_" suf "_split" 
 60                         #}else{
 61                         #       print $0
 62                         }
 63                 }'
 64                 echo `date` $fn "end!"
 65                 echo >&1000
 66         } &
 67 done
 68 echo "done !!!!!!"
  • 31 줄: trap 명령, 프로그램 수신 Ctrl + c 단말기 신호 처리
  • exec 1000 > & -: 파일 설명자 1000 의 쓰기 닫 기
  • exec 1000
  • 2: Ctrl + c 신호 수신
  • 33 - 36 줄:
  • 33 줄: 현재 프로그램의 프로 세 스 번호 가 져 오기
  • 34 줄: mkfifo 파 이 프 를 만 들 고 파이프 이름 은 현재 프로 세 스 의 프로 세 스 번호
  • 35 줄: exec 명령, 파일 설명자 1000 을 상기 파이프 와 연결 합 니 다. 그 중에서 바 인 딩 을 기록 합 니 다. 여 기 는 < > 를 사용 하여 읽 기와 쓰 기 를 동시에 파이프 와 연결 할 수 있 습 니 다
  • 36 줄: 파이프 파일 삭제 (왜 여기 서 삭 제 했 는 지 잘 모 르 겠 음)
  • 특별 설명: 여기 서 왜 파이프 파일 과 파일 설명 자 를 연결 하고 파이프 파일 을 직접 사용 하면 안 됩 니까?답 은 틀림없이 안 될 것 이다. 아래 의 내용 은 나의 이해 이다.다 중 프로 세 스 제 어 를 실현 하려 면 반드시 두 가지 기능 을 사용 해 야 한다. 첫째, 파이프 의 특수성 (차단 기능).둘째, 파일 설명자 에 대한 read 와 echo 작업 을 통 해 파이프 의 데이터 내용 을 제어 합 니 다 (이것 이 야 말로 다 중 프로 세 스 수 를 제어 하 는 관건 입 니 다).상기 기능 을 만족 시 키 기 위해 서 는 파일 설명자 와 fifo 를 연결 하여 파일 설명자 가 파일 읽 기와 쓰기 기능 과 파이프 기능 을 동시에 가 질 수 있 도록 합 니 다
  • .
  • 38 줄: 현재 시스템 의 스 레 드 N 을 가 져 와 병렬 실행 프로 세 스 수
  • 40 - 42 줄: 파일 설명자 1000 에 N 의 빈 줄 을 기록 하여 병렬 프로 세 스 수 를 제어 합 니 다
  • 45 - 67 줄: N 프로 세 스 처리 로그 파일 병렬 열기
  • 48 줄: 파일 설명자 1000 에서 한 줄 을 읽 으 려 면 현재 파일 설명자 1000 에 아무런 내용 이 없 으 면 read 명령 이 막 힙 니 다 (파이프 특성 에 의 해 결 정 됩 니 다)
  • 49 - 66 줄: 병행 처리 가 필요 한 프로그램 블록 입 니 다. 그 중에서 66 줄 의 마지막 & 이 프로그램 블록 을 배경 에 놓 고 실행 하 겠 다 고 표시 합 니 다
  • 특히 설명: 최초의 파이프 에 N 의 빈 줄 이 있 고 N 개의 read 명령 이 순조롭게 실 행 될 것 이 며 후속 프로그램 은 빠 르 면 계속 아래로 실 행 될 수 있 습 니 다. 그러나 후속 적 인 read 명령 은 파이프 에 모든 내용 이 막 히 지 않 기 때문에 실 행 된 프로그램 블록 이 65 줄 까지 실 행 될 때 파이프 에 빈 줄 을 기록 합 니 다.따라서 차단 대기 열 에 있 는 read 명령 은 파이프 에서 빈 줄 로 읽 히 고 후속 프로그램 블록 은 배경 에 놓 여 실 행 됩 니 다.이것 이 바로 fifo 를 통 해 병렬 프로그램 을 제어 하 는 관건 이다.

  • 좋은 웹페이지 즐겨찾기