bash script2023. 4. 11. 13:36

 

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

 

함수를 백그라운드로 호출해서 여러개의 작업을 동시에 실행하는 방법에 대한 추가 사항. 기본적인 내용은 이전 게시물을 참고하자. 여기로

함수를 백그라운드로 호출했을 때, 해당 함수의 실행이 완료되었는지를 판단해야 할 때가 있다. 예를 들어 함수 func1, func2 두개의 함수를 동시에 백그라운드로 실행한 후에 작업이 다 완료되면 그 결과를 가지고 뭔가 추가적인 작업을 하는 경우다.

실행 완료 여부를 확인하려면 현재 진행중인 프로세스를 알려주는 jobs 명령을 이용하면 된다. 뭔가 백그라운드 작업이 있다면 jobs 명령에 대한 결과는 아래와 같은 형태로 나온다. 아래의 간단한 예시를 보자.

# 30초간 대기 (백그라운드에서 대기)
sleep 30 &
# 작업중인 프로세스 목록 확인
jobs
[1]+  Running     sleep 30 &

스크립트에서 함수를 백그라운드로 호출한 후에 jobs 명령을 실행하면 현재 실행중인 함수의 목록을 출력하게 된다. 아래의 예시를 보자. 5초마다 한번씩 함수의 종료 여부를 확인하는 경우다.

# func1 함수 정의
function func1(){
...
}
# func2 함수 정의
function func2(){
...
}

# 함수 호출 (백그라운드)
func1 &
func2 &
# 종료 여부 확인
while [[ 1 ]]
do
  sleep 3
  # 작업중인 프로세스 목록 중에 func1 또는 func2 존재 여부 확인
  func_check=`jobs | grep "func1\|func2" | grep "Running" | wc -l`
  if [[ $func_check -eq 0 ]]
    then echo "함수 실행 완료"
    break
  fi
done
# 여기서 부터 후속 작업
...

만약 하나의 함수를 가지고 인자를 바꿔서 동시 실행하는 경우에는 위의 예시에서 grep 명령의 옵션을 적당히 조정해 주면 된다. 아래의 예시를 보자.

# 함수 호출
func "abc" &
func "def" &
# 종료 여부 확인
while [[ 1 ]]
do
  sleep 3
  func_check=`jobs | grep "func" | grep "abc\|def" | grep "Running" | wc -l`
  if [[ $func_check -eq 0 ]]
    then echo "함수 실행 완료"
    break
  fi
done
# 여기서 부터 후속 작업
...

함수뿐만 아니라 어플리케이션을 여러개 실행할 때도 응용할 수 있다. 이 경우 jobs 명령의 출력은 함수명이 아니라 어플리케이션이 될 것이다. 아래의 예시를 보자. eth0, eth1에서 전송되는 패킷을 tcpdump 명령으로 동시에 저장하는 경우다.

# eth0, eth1에서 패킷 50000개를 eth0_dump.pcap 파일에 저장
tcpdump -i eth0 -w eth0_dump.pcap -c 50000 &
tcpdump -i eth1 -w eth1_dump.pcap -c 50000 &
# tcpdump 완료 여부 확인 (3초 간격)
while [[ 1 ]]
do
  sleep 3
  tcpdump_check=`jobs | grep "tcpdump" | grep "eth0\|eth1" | grep "Running" | wc -l`
  if [[ $tcpdump_check -eq 0 ]]
    then echo "tcpdump 완료"
    break
  fi
done
# 후속 작업
...

여러 개의 작업을 병렬로 처리할 때 매우 요긴하게 활용할 수 있다.

728x90
Posted by 반달가면