본문 바로가기
Utils & Infra & Tool/Shell

프로세스 병렬로 돌리는 예제 Shelll

by 무대포 개발자 2021. 8. 2.
728x90
반응형

linux 환경에서 프로세스를 병렬로 돌리는 shell 정리

wait 란?

  • linux 에서 wait 명령어는 자식프로세스가 종료할 때까지, 부모프로세스가 sleep() 모드로 기다립니다.
  • 예를 들면, 부모 process 에서 자식 프로세스를 호출하는데 자식 프로세스가 20초 걸린다고 가정하겠습니다.
  • 자식 프로세스가 20초 걸릴 동안 부모 process 가 종료를 해버리면 자식 프로세스는 좀비 프로세스가 되버립니다. 그렇기 위해 wait 를 사용합니다.

shell source

  • parallelTest.sh
    • subModule.sh, subModule2.sh 를 병렬로 호출하고 각 자식프로세스를 wait 했다가 마지막에 각 자식 프로세스의 exitCode 를 출력합니다.
#!/bin/sh


# 각 pid 를 저장하기 위한 변수입니다.
pids=""

# subModule 을 백그라운드로 호출합니다. 프로세스를 fork 해서 호출합니다.
sh ./subModule.sh &
# subModule 의 pid 를 pids 변수에 저장합니다.
pids+=" $!"
sh ./subModule2.sh &
pids+=" $!"

echo "start all subModule..."
status=[]
i=0
for p in $pids; do
    # 자식 프로세스를 기다립니다.
    wait ${p}
    # 자식 프로세스의 exitCode 를 status 변수에 저장합니다.
    status[$i]=$?
    ((i+=1))
done

# 자식 프로세스의 exitCode 를 출력합니다.
for st in ${status[@]};
do
    echo "status : ${st}"
done

echo "all subModule end..."

  • subModule.sh
# subModule shell 은 subModule 을 2초마다 출력합니다.


echo "subModule..."
sleep 2
echo "subModule..."
sleep 2
echo "subModule..."
sleep 2
echo "subModule..."
sleep 2
echo "subModule..."
sleep 2
echo "subModule..."
sleep 2

  • subModule2.sh
# subModule2 를 3초마다 호출하고 마지막에 에러를 냅니다.

echo "subModule2..."
sleep 3
echo "subModule2..."
sleep 3
echo "subModule2..."
sleep 3
aekfjwekfje

결론 & 주의사항

  • 예상치 못한 에러가 발생할 수 있기에, 병렬로 돌리기 위해서는 반드시 테스트를 해봐야 합니다.
  • 예를 들면, spring batch 작업을 여러개 수행한다면 내장 톰캣을 disable 시켜서 돌려야 합니다. port 충돌납니다.
    • spring.main.web-application-type=none (disable 옵션)

reference

댓글