병렬로 실행해야 하는 여러 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
배열도 불필요합니다