스크립트를 병렬로 실행할 때 Bash 스크립트가 절전 모드로 전환되지 않습니다.

스크립트를 병렬로 실행할 때 Bash 스크립트가 절전 모드로 전환되지 않습니다.

병렬로 실행해야 하는 여러 bash 스크립트가 있습니다. 그러나 메모리 집약적이므로 각각 30초씩 시차를 두고 병렬로 실행하고 싶습니다. 예를 들어:

hourr=($(seq 0 1 23))

for q in "${hourr[@]}";
do;
echo $q; sleep 10;
done

10초 동안 기다린 후 0부터 23까지 순서대로 숫자를 출력합니다. 그러나 스크립트를 사용하여 이 작업을 수행하려고 하면 다음과 같습니다.

hourr=($(seq 0 1 23))
input1="20160101"; 
input2="10"; #(Note: These are inputs to each of the scripts I want to run)
scriptdir="/path/to/somewhere"
for q in "${hourr[@]}"
do
if [ "${#q}" == "1" ]
then
hh=0${q}
else
hh=${q}
fi
echo $hh
( bash $scriptdir/Hour$hh.csh $input1 $input2 ; sleep 30 ) &
done
wait
echo "All done!"

그러나 기본 스크립트가 실행되면 모든 Hour 스크립트가 즉시(정확하고 병렬로) 실행되며 내가 지정한 30초 동안 기다리지 않고 차례로 실행됩니다. 어떤 아이디어가 있나요?

답변1

그렇다면 어떻게 될까요?

#/bin/bash

input1='20160101'
input2='10' #(Note: These are inputs to each of the scripts I want to run)
scriptdir='/path/to/somewhere'
for q in {00..23}
do
    hh="${q}"
    echo "$hh"
    ( bash "$scriptdir/Hour$hh.csh" "$input1" "$input2" ) &
    sleep 30
done
wait
echo "All done!"

주석에서 지적했듯이 이로 &인해 스크립트가 sleep백그라운드에서도 실행되므로 스크립트는 루프의 다음 반복을 시작하기 전에 완료될 때까지 기다리지 않습니다. 귀하의 hourr배열도 불필요합니다

관련 정보