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

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

저는 Ubuntu 18.01 LTS를 실행하는 서버로 작업 중이며 여러 가상 머신의 백업을 자동화하려고 합니다.

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

여기 내 스크립트가 있습니다.

#!/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명령이 각 VM을 포그라운드 프로세스로 시작하므로 이전 VM이 종료될 때까지 루프 실행이 다음 VM으로 계속되지 않는다는 것입니다.

스크립트의 다시 시작 부분에서는 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

참조:

관련 정보