bash script2023. 4. 7. 17:31

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/535211

 

bash 스크립트에서 함수(function)는 특정 작업을 반복적으로 수행해야 할 때 매우 요긴한데, CPU 부하가 많이 걸리는 작업을 함수로 구현했을 경우 - 두어가지 유의할 점만 신경 쓰면 - 백그라운드로 여러개를 동시에 실행시켜서 소요 시간을 단축시킬 수 있다. (함수에 대한 기본적인 내용은 이전 게시물을 참고하자.)

아래의 간단한 예시를 보면서 감을 잡아 보자. ~/dir_1, ~/dir_2 디렉토리에서 txt 파일을 골라서 내용중에 문자열 "abcd"가 포함되어 있는지 확인하고, 만약 있으면 해당 파일명을 출력하는 스크립트이다.

# function: search_abcd [디렉토리] [문자열]
function search_string(){
  # 첫번째 인자($1)로 받은 디렉토리로 이동
  cd $1
  # 해당 디렉토리에서 .txt로 끝나는 파일에 대해 문자열(두번째 인자, $2) 포함 여부 확인
  for file in `ls | grep "\.txt$"`
  do
    # 파일에 특정 문자열($2)이 포함되어 있는 행의 수 구하기
    str_check=`cat $file | grep "$2" | wc -l`
    # 만약 1개 이상의 행이 해당 문자열을 포함하고 있다면 파일명 출력
    if [[ $str_check -ge 1 ]]
    then echo "$1 디렉토리에 있는 $file에 문자열 $2가 포함되어 있습니다."
    fi
  done
}

# main
# ~/dir1 디렉토리에 대해 문자열 검색
search_string ~/dir1 abcd
# ~/dir2 디렉토리에 대해 문자열 검색
search_string ~/dir2 abcd

자, 위의 예시를 보면 search_string 함수를 이용해서 ~/dir1 디렉토리에 대해 작업을 한 후에 ~/dir2 디렉토리에 대해 작업을 한다. 두 작업은 서로 독립적이므로, 함수를 백그라운드로 실행하면 두 작업을 동시에 진행할 수 있다.

단, 그렇게 하려면 유의해야 할 점이 있다. 함수 내부에서 사용하는 변수를 지역변수(local variable)로 선언해 주어야 한다. 두 함수가 동시에 실행되므로 같은 이름의 변수를 두개의 함수에서 동시에 사용하려면 반드시 함수 내부에서만 의미가 있도록 해 주어야 하는 것이다. 지역변수라고 명시되지 않은 변수는 기본적으로 전역변수(global variable)로 간주되므로 반드시 지역변수 선언을 해 주자.

또 한가지 생각해야 할 점은, 함수를 백그라운드로 실행했기 때문에 스크립트가 종료되었다고 해서 작업이 종료된 것을 의미하지 않는다는 것이다. 함수의 시작과 종료를 알려주는 내용을 출력하면 좀 더 친절한 스크립트가 된다.

위의 두가지 사항을 고려해서 스크립트를 고치면 아래와 같이 된다.

# function: search_abcd [디렉토리] [문자열]
function search_string(){
  # 지역변수(local variable) 선언
  local file
  local str_check
  # 함수 시작 메세지 출력
  echo "[search_string() 시작] 디렉토리 $1, 문자열 $2"
  # 첫번째 인자($1)로 받은 디렉토리로 이동
  cd $1
  # 해당 디렉토리에서 .txt로 끝나는 파일에 대해 문자열(두번째 인자, $2) 포함 여부 확인
  for file in `ls | grep "\.txt$"`
  do
    # 파일에 특정 문자열($2)이 포함되어 있는 행의 수 구하기
    str_check=`cat $file | grep "$2" | wc -l`
    # 만약 1개 이상의 행이 해당 문자열을 포함하고 있다면 파일명 출력
    if [[ $str_check -ge 1 ]]
    then echo "$1 디렉토리에 있는 $file에 문자열 $2가 포함되어 있습니다."
    fi
  done
  # 함수 종료 메세지 출력
  echo "[search_string() 종료] 디렉토리 $1, 문자열 $2"
}

# main
# ~/dir1 디렉토리에 대해 문자열 검색(백그라운드)
search_string ~/dir1 abcd &
# ~/dir2 디렉토리에 대해 문자열 검색(백그라운드)
search_string ~/dir2 abcd &
# 안내 메세지 출력
echo "작업이 아직 종료된 것이 아닙니다. 각 디렉토리에 대한 작업 종료 메세지가 나올 때까지 기다려 주세요."

거의 모든 PC가 멀티코어 CPU를 장착하고 있기 때문에, 서로 독립적인 다수의 반복작업을 해야 될 경우 함수로 구현하고 백그라운드로 실행하면 훨씬 더 빠르게 결과를 얻을 수 있다.

 

 

728x90
Posted by 반달가면