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
'Utils & Infra & Tool > Shell' 카테고리의 다른 글
sftp 자동화 script (Expect 활용) (0) | 2021.10.13 |
---|---|
find, mv 를 조합해서 폴더에서 폴더로 파일 이동 또는 복사 (0) | 2021.04.19 |
unix shell array for loop, for loop 내부에서 curl 호출 (0) | 2021.02.09 |
텍스트 더미 데이터 만드는 Shell (0) | 2020.07.10 |
Sftp Shell Script with password (0) | 2020.07.10 |
댓글