반달가면 이글루에서 백업 - 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를 장착하고 있기 때문에, 서로 독립적인 다수의 반복작업을 해야 될 경우 함수로 구현하고 백그라운드로 실행하면 훨씬 더 빠르게 결과를 얻을 수 있다.
'bash script' 카테고리의 다른 글
[bash: <<. >] FTP 자동접속 및 전송 결과 확인 (0) | 2023.04.11 |
---|---|
[bash: sort] 특정 항목(field)을 기준으로 정렬하기 (0) | 2023.04.07 |
[bash: find] 파일/디렉토리 검색 속도 향상을 위한 색인(index) 만들기 (0) | 2023.04.07 |
[bash: printf] 형식을 지정해서 출력하기 (0) | 2023.04.07 |
[bash: $?] 오류 발생 여부 확인 (0) | 2023.04.07 |