Virtualbox VM 종료를 기다리는 Bash 스크립트?

Virtualbox VM 종료를 기다리는 Bash 스크립트?

Virtualbox에는 실행 중인 VM에 명령을 실행할 수 있는 기능이 있습니다.

vboxmanage controlvm NameOfRunningVM acpipowerbutton

그러나 이 명령은 즉시 반환되어 내 상황에서는 비정상 종료가 발생합니다.

상황: 나는 이것을 /etc/init.d 스크립트에서 사용할 계획입니다. 이렇게 하면 실행 중인 모든 VM을 정상적으로 종료할 수 있습니다. 현재 명령을 실행하면 vboxmanage controlvm NameOfRunningVM acpipowerbutton명령이 VM이 종료될 때까지 기다리지 않기 때문에 종료가 중단됩니다.

Virtualbox 시스템의 이름과 시간 초과(초)를 입력으로 사용하고 VM이 "전원 끄기" 상태로 돌아갈 때까지 기다리거나 시간 초과가 발생하는 Bash 스크립트가 필요합니까?

이 작업을 수행하는 가장 좋은 방법이 무엇인지 잘 모르겠습니다.


다음 명령을 사용하여 VM 상태를 확인하려고 생각했습니다.

[user@machine ~]$ vboxmanage list runningvms
"VirtualMachineName" {65c93f1f-4508-4119-b07d-ce9e89b23b8e}

bash 스크립트는 실행 중인 VM 목록을 폴링할 수 있습니다. 머신 이름이 더 이상 나열되지 않으면 VM은 완료된 것으로 간주됩니다.

답변1

폴링을 사용하면 다음과 같이 수행할 수 있습니다.

#!/bin/bash
MACHINE=$1
echo "Waiting for machine $MACHINE to poweroff..."

until $(VBoxManage showvminfo --machinereadable $MACHINE | grep -q ^VMState=.poweroff.)
do
  sleep 1
done

답변2

@larstobi와 같은 아이디어지만, 조사를 감시 명령으로 오프로드하여 번거로움을 줄입니다.

$ vboxmanage list vms
"guest" {fubar-rabuf-bufu}
$ vboxmanage showvminfo guest | grep -i state
State:           running (since 2020-08-05T02:37:13.784000000)
$ printf '( watch -te  -- "! vboxmanage showvminfo guest | grep -i poweroff" >&- & wait )' | time -p bash
Command terminated by signal 2
real 5.05
user 0.00
sys 0.00

플래그 -e는 명령의 0이 아닌 결과에 대해 종료를 발생시키는 반면 -t성가신 헤더를 끕니다. 우리는 감시를 위해 stdout을 닫습니다. 왜냐하면 목적은 차단하는 것이고 포크에서 실행하는 반면 기술적으로 차단하는 wait것은 중단 가능하기 때문입니다.

time -p bash이 데모의 목적을 위해 쉽게 연결할 수 있도록 명령 문자열을 에 전달 time하지만 실제로는 다음을 수행할 수 있습니다.

$ ( watch -te  -- "! expression" >&- & wait )

면책조항: 이 중 어느 것도 실제로 테스트되지 않았습니다.

관련 정보