Bash 배열은 첫 번째 인덱스만 실행합니다.

Bash 배열은 첫 번째 인덱스만 실행합니다.

저는 Ubuntu 18.01 LTS를 실행하는 서버를 사용하고 있으며 여러 가상 머신의 백업을 자동화하려고 합니다.

VM 이름을 배열에 넣은 다음 for 루프를 사용하여 각 VM을 종료, 백업 및 다시 시작했습니다. 주말에 이것을 실행하고 오늘 들어왔더니 모든 명령이 실행되는 것 같지만 배열의 첫 번째 인덱스에 대해서만 실행되고 스크립트가 종료되지 않습니다.

이것은 내 스크립트입니다.

#!/bin/bash
######################
#
# Shut down and back up select VMs
#
#####################

#make new date formatted directory
sudo mkdir /mnt/md1/VirtualMachines/bak/$(date +%Y_%m_%d) |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt;
sudo chown bvserv /mnt/md1/VirtualMachines/bak/$(date +%Y_%m_%d) |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt;

#Array of VMs
declare -a VM=("Win-10-POS-1" "Win-10-POS-2" "Desktop_Neil")

#loop through array of VMs
for i in "${VM[@]}"
do
# Shut down virtual machine
sudo -u bvserv VBoxManage controlvm "$i" poweroff |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt;
# Export virtual machine to dated file
sudo -u bvserv VBoxManage export "$i" -o /mnt/md1/VirtualMachines/bak/$(date +%Y_%m_%d)/"$i".ova |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt;
# Restart virtual machine
sudo -u bvserv VBoxHeadless --startvm "$i" |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt
done

답변1

문제는 VBoxHeadless명령이 각 가상 머신을 포그라운드 프로세스로 시작하므로 이전 가상 머신이 종료될 때까지 루프 실행이 다음 가상 머신으로 계속되지 않는다는 것입니다.

스크립트의 재부팅 부분에서는 VBoxHeadless 대신 VBoxManage를 사용하여 머신을 부팅해야 합니다. 변경한 후에는 모든 것이 잘 작동합니다. 다음은 참조를 위해 외부 배열을 로드하는 업데이트된 스크립트입니다.

#!/bin/bash
######################
#
# Shut down and back up select VMs
#
#####################

#make new date formatted directory
sudo mkdir /mnt/md1/VirtualMachines/bak/$(date +%Y_%m_%d) |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt;
sudo chown bvserv /mnt/md1/VirtualMachines/bak/$(date +%Y_%m_%d) |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt;

#Read array of virtual machines from file
readarray -t VM < /mnt/md1/VirtualMachines/auto-start_list.txt

#loop through array of VMs
for i in "${VM[@]}"
do
# Shut down virtual machine
sudo -u bvserv VBoxManage controlvm "$i" poweroff |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt;
# Export virtual machine to dated file
sudo -u bvserv VBoxManage export "$i" -o /mnt/md1/VirtualMachines/bak/$(date +%Y_%m_%d)/"$i".ova |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt;
# Restart virtual machine
sudo -u bvserv VBoxManage startvm "$i" --type headless |& tee -a /mnt/md1/Scripts/log_vboxBak_$(date +%Y_%m_%d).txt
#echo "$i"
done

인용하다:

관련 정보