Saya membuat skrip python yang akan menangguhkan semua menjalankan VirtualBox VMs, dan kemudian mengatur sistem untuk menjalankan skrip pada logout sebagai tugas yang dijadwalkan.
Saya tidak tahu seberapa andal metode ini. Seperti orang lain telah mencatat ada batasan untuk berapa lama sistem akan menunggu tugas Winlogon 7002 selesai. Tapi saya pribadi tidak punya masalah dengan itu memberikan negara menyimpan yang dapat digunakan bahkan dengan beberapa VM yang berjalan di 4+ GB dari keseluruhan VM RAM.
Berikut langkah-langkah untuk mengaturnya:
- Unduh dan instal Python 2.7.x dari python.org
- Buat file skrip python di suatu tempat di sistem Anda menggunakan Notepad atau editor teks biasa lainnya (lihat di bawah)
- Buka Penjadwal Tugas
- Pilih Aksi -> Buat Tugas Dasar ... dan gunakan wizard untuk membuat tugas dengan pengaturan berikut
- Nama pilihan Anda
- Mulai tugas saat peristiwa tertentu dicatat
- Log: Sistem
- Sumber: Winlogon
- ID Peristiwa: 7002
- Mulai Program
- Di sebelah Program / Script , masukkan path lengkap ke Anda
python.exe
, misalnyac:\Python27\python.exe
- Di sebelah Tambahkan argumen , masukkan path lengkap tempat Anda meletakkan file skrip python, misalnya saya meletakkan file saya di subfolder dari folder dokumen saya, jadi ini adalah
C:\Users\rakslice\Documents\vboxsuspend\vboxsuspend.py
- Pilih Selesai.
Sekarang VirtualBox VMs harus ditangguhkan pada saat logout / restart / shutdown.
Skrip python untuk melakukan shutdown di bawah ini:
# A script to suspend all running VirtualBox VMs
import os
import subprocess
import sys
class VM(object):
def __init__(self, name, uuid):
self.name = name
self.uuid = uuid
def __repr__(self):
return "VM(%r,%r)" % (self.name, self.uuid)
class VBoxRunner(object):
def __init__(self):
program_files = os.environ["ProgramW6432"]
vbox_dir = os.path.join(program_files, "Oracle", "VirtualBox")
self.vboxmanage_filename = os.path.join(vbox_dir, "VBoxManage.exe")
def vbox_run(self, *args):
subprocess.check_call([self.vboxmanage_filename] + list(args))
def vbox_run_output(self, *args):
return subprocess.check_output([self.vboxmanage_filename] + list(args))
def list(self, running=True):
if running:
list_cmd = "runningvms"
else:
list_cmd = "vms"
return [self.parse_vm_list_entry(x) for x in self.vbox_run_output("list", list_cmd).strip().split("\n")]
def suspend_all(self):
success = True
stopped_some_vms = False
vms = self.list(running=True)
for vm in vms:
if vm is None:
continue
# noinspection PyBroadException
try:
self.suspend_vm(vm)
except:
success = False
else:
stopped_some_vms = True
if not stopped_some_vms:
self.message("No running vms")
return success
@staticmethod
def parse_vm_list_entry(x):
""":type x: str"""
if not x.startswith('"'):
return None
end_pos = x.find('"', 1)
if end_pos == -1:
return None
name = x[1:end_pos]
assert x[end_pos + 1: end_pos + 3] == " {"
assert x.endswith("}")
uuid = x[end_pos + 2:]
return VM(name, uuid)
@staticmethod
def message(msg):
print >>sys.stderr, msg
def suspend_vm(self, vm):
assert isinstance(vm, VM)
self.vbox_run("controlvm", vm.uuid, "savestate")
def main():
vr = VBoxRunner()
success = vr.suspend_all()
if not success:
sys.exit(1)
if __name__ == "__main__":
main()