쉘 스크립트에서 nohup 작업이 완료될 때까지 기다리는 방법은 무엇입니까?

쉘 스크립트에서 nohup 작업이 완료될 때까지 기다리는 방법은 무엇입니까?

다음 스크립트가 있습니다.

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 flockEasy Shell 액세스 가능 파일 잠금을 참조하세요 .

관련 정보