Shell 병렬처리

 

간단하게 두세가지 작업을 수행해야 하는데 이 작업들이 모두 끝나는 시점에 수행해야 하는 작업이 있습니다. 보통 두세가지 작업을 동시에 하려면 &(Ampersand)를 붙여 백그라운드 작업으로 돌리면 해결될 문제입니다. 하지만 모두 끝나는 시점에 무언가를 해야 한다면 조금 생각해볼 문제가 되겠죠. 생각을 해보면 작업을 수행할때마다 PID값을 알아내어 이 PID가 끝나길 기다렸다가 끝나는대로 다음 작업을 수행하면 될 것 같습니다. 이런 경우를 위해 wait라는 명령이 bash쉘에 Builtin되어있습니다. 간단하게 다음의 예제를 확인해 보겠습니다.

 

#!/bin/sh

echo "예제를 시작합니다"

sleep 10 &
sleep 15 &

echo "모든 명령이 병렬로 실행되었습니다"

WORK_PID=`jobs -l | awk '{print $2}'`
wait $WORK_PID

echo "모든 명령이 종료되었습니다"

이 예제를 실행해 보면 다음과 같은 결과를 보여줍니다.

예제를 시작합니다
모든 명령이 병렬로 실행되었습니다
모든 명령이 종료되었습니다

jobs명령의 경우 -l옵션을 붙여주게 되면 PID값도 함께 출력되게 됩니다. 이것을 이용하면 굳이 매번 프로세스를 실행할때마다 PID를 저장하려는 노력을 하지 않아도 됩니다.

[eye@theeye ~]# sleep 500 &
[1] 4962
[eye@theeye ~]# jobs
[1]+  Running                 sleep 500 &
[eye@theeye ~]# jobs -l
[1]+  4962 Running                 sleep 500 &
간단히 하면 다음과 같이 할수 있다.

 

sleep 100 & sleep 120 &
wait $(jobs -l |awk '{print $2}')
echo 'all done'