다음 스크립트가 있습니다.
echo "$wk" | while read -r a b;
do
counter=$(($counter+1))
nohup sh -c 'impala-shell -d nielsen -f query.sql --var=dt=$a --var=incre=$b;
echo $a,$?>>$week_status_file;
if [ $? -ne 0 ]; then
echo $a,$b>>$err_week_file
fi'
if [ $(($counter%5)) == 0 -a $counter -ge 5 ];
then
echo "Check"
wait
fi
done
impala-shell...
아이디어는 두 개의 변수 a
및 (변수에서)를 사용하여 b
래핑된 명령을 시작하는 것 입니다 wk
. 이는 5개의 프로세스와 병렬로 수행되어야 합니다. 다음 5개 작업은 처음 5개 프로세스가 완료될 때까지 기다려야 합니다. 내 현재 코드는 그것을 인쇄 Check
하지만 전혀 기다리지 않습니다. 그러나 wait
으로 변경하면 sleep 10s
잠자기 상태가 됩니다.
여기서 어떻게 wait
일하나요?
답변1
프로세스 식별자(PID)를 제공해야 합니다 wait
. 또한 설명에 따르면 명령이 차단되는 것처럼 들리지 않아 궁극적으로 기다리고 싶은 PID를 수집하기가 더 어려워집니다. 예를 들어 프로세스가 분기 중이고 새 분기 프로세스의 PID를 모르더라도 스크립트 작성을 계속할 수 있는 경우입니다.
그러나 nohup sh -c ...
회선이 차단된 경우 백그라운드로 보내기를 사용하고 &
백그라운드 프로세스의 PID를 저장한 다음 마지막으로 저장한 모든 PID를 기다립니다(예: $WAIT_FOR_PIDS
). 이 변수는 $!
실행을 위해 백그라운드로 전송된 마지막 프로세스의 PID를 제공합니다.
WAIT_FOR_PIDS="";
echo "$wk" | while read -r a b;
do
counter=$(($counter+1))
nohup sh -c 'impala-shell -d nielsen -f query.sql --var=dt=$a --var=incre=$b;
echo $a,$?>>$week_status_file;
if [ $? -ne 0 ]; then
echo $a,$b>>$err_week_file
fi' & WAIT_FOR_PIDS="$WAIT_FOR_PIDS $!"
if [ $(($counter%5)) == 0 -a $counter -ge 5 ];
then
echo "Check"
wait $WAIT_FOR_PIDS
WAIT_FOR_PIDS=""
fi
done
또한 병렬로 에코할 때는 경쟁 조건을 고려해야 합니다 $week_status_file
. man flock
Easy Shell 액세스 가능 파일 잠금을 참조하세요 .