고급 셸 프로 그래 밍 가이드 학습 노트 (3) - "다 중 스 레 드"/작업 제어: tar 압축 풀기 진도 바

3582 단어
다 중 스 레 드 에 따옴표 가 붙 은 것 은 셸 스 크 립 트 언어 에 다 중 스 레 드 메커니즘 이 없 기 때 문 입 니 다. 다 중 스 레 드 는 실제 스 크 립 트 에서 명령 이나 명령 집합 에 대한 작업 제어 이 고 작업 과 스 레 드 는 두 가지 개념 입 니 다.다음은 재 미 있 는 열 을 통 해 간단 하고 흔히 볼 수 있 는 작업 통제 과정 을 소개 한다.
우선 대본 을 올 립 니 다.이 스 크 립 트 의 기능 은 tar 명령 으로 압축 파일 을 풀 때 진행 바 를 표시 하 는 것 입 니 다.
#!/bin/bash
#Tarprogressbar.sh
#      tar             

FILE="test.tar.gz"

TOTAL_SIZE=0
for FILE_SIZE in $(tar tvvf $FILE | awk '{print $3}'); do
    if [ "$FILE_SIZE" = "${FILE_SIZE//[^0-9]/}" ]; then 
        TOTAL_SIZE=$((TOTAL_SIZE+FILE_SIZE))
    fi
done

TMPFIFO=/tmp/tmpfifo &> /dev/null
if [[  -f $TMPFIFO ]];then
:
else
    mkfifo $TMPFIFO &> /dev/null
fi

(
TOTAL_FILE_SIZE_UNZIP=0
{
p=1
while read line
do
    FILE_SIZE_UNZIP=$(echo $line | awk '{print $3}')
    ((TOTAL_FILE_SIZE_UNZIP=$TOTAL_FILE_SIZE_UNZIP+$FILE_SIZE_UNZIP))
    echo $((TOTAL_FILE_SIZE_UNZIP*100/TOTAL_SIZE))
done$TMPFIFO 2>/dev/null 
wait $B_PID
echo " unzip ended successfully. "



실현 방향:
  • 진도 애니메이션 은 whiptail 을 사용 하여 이 루어 집 니 다.
  • 압축 을 푸 는 진도 의 계산 은 압축 패키지 안의 파일 의 부피 로 진행 되 며, 먼저 모든 파일 의 부 피 를 계산 한 다음 에 압축 을 풀 때 출력 하 는 파일 크기 에 따라 압축 을 푸 는 진 도 를 계산한다.
  • 어 려 운 해결: 어떻게 진도 바 를 새로 고치 면서 압축 을 풀 수 있 습 니까?이것 은 바로 작업 통 제 를 사용 하여 압축 을 푸 는 명령 을 배경 에 집합 시 킨 다음 에 하나의 파 이 프 를 통 해 압축 을 푸 는 파일 크기 를 압축 을 푸 는 작업 에 전달 하 는 것 이다.

  • 다음 부분 은 코드 를 처음부터 정리 하 겠 습 니 다.
    TOTAL_SIZE=0
    for FILE_SIZE in $(tar tvvf $FILE | awk '{print $3}'); do
        if [ "$FILE_SIZE" = "${FILE_SIZE//[^0-9]/}" ]; then 
            TOTAL_SIZE=$((TOTAL_SIZE+FILE_SIZE))
        fi
    done
    

    이 단락 은 압축 된 가방 안의 파일 의 전체 크기 를 계산 하기 위해 서 입 니 다. 사실은 압축 된 가방 이 압축 을 푸 는 과정 입 니 다. 파일 이 풀 리 지 않 았 을 뿐 awk 명령 을 통 해 출력 정 보 를 얻 은 세 번 째 열의 파일 크기 를 합 쳐 계산 합 니 다.
    TMPFIFO=/tmp/tmpfifo &> /dev/null
    if [[  -f $TMPFIFO ]];then
    :
    else
        mkfifo $TMPFIFO &> /dev/null
    fi
    

    여기 가 바로 파 이 프 를 만 드 는 것 이 니 할 말 이 별로 없다.
    (
    TOTAL_FILE_SIZE_UNZIP=0
    {
    p=1
    while read line
    do
        FILE_SIZE_UNZIP=$(echo $line | awk '{print $3}')
        ((TOTAL_FILE_SIZE_UNZIP=$TOTAL_FILE_SIZE_UNZIP+$FILE_SIZE_UNZIP))
        echo $((TOTAL_FILE_SIZE_UNZIP*100/TOTAL_SIZE))
    done$TMPFIFO 2>/dev/null 
    wait $B_PID
    echo " unzip ended successfully. "
    

    이 단락 은 핵심 코드 다.먼저 괄호 가 묶 인 부분 을 보면 명령 집합 을 표시 하고 괄호 안에 괄호 가 하나 더 있 습 니 다. 괄호 가 묶 인 부분 은 파 이 프 를 통 해 whiptail 명령 으로 진도 바 를 출력 하기 위 한 백분율 매개 변수 입 니 다.괄호 의 끝 에 '&' 기호 가 있 는데 괄호 안의 명령 집합 을 배경 으로 실행 하고 그 후의 명령 은 실행 이 끝 날 때 까지 기다 리 지 않 아 도 작업 을 시작 할 수 있 음 을 나타 낸다."$!"는 이전 과정의 프로 세 스 번호 나 작업 번 호 를 표시 합 니 다. 여 기 는 사실 작업 번 호 를 표시 합 니 다.뒤에 실 행 된 명령 이 이 값 을 새로 고치 지 않도록 변수 로 저장 합 니 다.다음
    tar zxvvf  $FILE -C /opt >$TMPFIFO 2>/dev/null 
    

    압축 을 푸 는 과정 에서 출력 정 보 를 파이프 TMPFIFO 에 전 달 했 습 니 다.
    우리 다시 돌아 보 자.
    while read line
    do
        FILE_SIZE_UNZIP=$(echo $line | awk '{print $3}')
        ((TOTAL_FILE_SIZE_UNZIP=$TOTAL_FILE_SIZE_UNZIP+$FILE_SIZE_UNZIP))
        echo $((TOTAL_FILE_SIZE_UNZIP*100/TOTAL_SIZE))
    done

    이 while 순환 뒤에 TMPFIFO 에서 데 이 터 를 읽 는 것 을 의미 하 는 리 셋 플래그 가 있 습 니 다. 그러면 압축 해제 과정의 정 보 를 배경 작업 에 전달 하고 백분율 을 계산 하 며 매개 변수 로 whiptail 명령 에 전달 하 는 것 을 교묘 하 게 실현 합 니 다.
    wait $B_PID
    

    wait 의 역할 은 B 까지 스 크 립 트 의 실행 을 중단 시 키 는 것 입 니 다.스 크 립 트 가 끝 났 을 때 애니메이션 이 새로 고침 되 지 않도록 PID 대표 의 작업 이 끝나 고 계속 실 행 됩 니 다.
  • 코드 는 완전한 테스트 를 거치 지 않 았 습 니 다. 문제 와 bug 가 있 으 면 제때에 피드백 하 십시오.
  • 좋은 웹페이지 즐겨찾기