ฉันสร้างสคริปต์ไพ ธ อนซึ่งจะระงับ VirtualBox VM ที่รันอยู่ทั้งหมดจากนั้นตั้งค่าระบบให้เรียกใช้สคริปต์เมื่อล็อกเอาต์เป็นงานที่กำหนดเวลาไว้
ฉันไม่รู้ว่าวิธีนี้น่าเชื่อถือเพียงใด ดังที่คนอื่น ๆ ระบุไว้ว่ามีข้อ จำกัด ว่าระบบจะรอให้งาน Winlogon 7002 ทำงานได้นานแค่ไหน แต่โดยส่วนตัวฉันไม่ได้มีปัญหาใด ๆ กับการให้สถานะการใช้งานที่ใช้งานได้แม้จะมีการใช้งาน VM หลายครั้งบน VM RAM โดยรวม 4+ GB
นี่คือขั้นตอนในการตั้งค่า:
- ดาวน์โหลดและติดตั้ง Python 2.7.x จาก python.org
- สร้างไฟล์สคริปต์หลามที่ใดที่หนึ่งในระบบของคุณโดยใช้ Notepad หรือโปรแกรมแก้ไขข้อความธรรมดาอื่น ๆ (ดูด้านล่าง)
- เปิด Task Scheduler
- เลือกการกระทำ -> สร้างงานพื้นฐาน ... และใช้ตัวช่วยสร้างเพื่อสร้างงานด้วยการตั้งค่าต่อไปนี้
- ชื่อที่คุณเลือก
- เริ่มงานเมื่อมีการบันทึกเหตุการณ์เฉพาะ
- เข้าสู่ระบบ: ระบบ
- ที่มา: Winlogon
- รหัสเหตุการณ์: 7002
- เริ่มโปรแกรม
- ถัดจากProgram / Scriptให้ป้อนพา ธ เต็มของคุณ
python.exe
เช่นc:\Python27\python.exe
- ถัดจากเพิ่มอาร์กิวเมนต์ให้ป้อนพา ธ แบบเต็มที่คุณใส่ไฟล์สคริปต์ของไพ ธ อนตัวอย่างเช่นฉันวางระเบิดลงในโฟลเดอร์ย่อยของโฟลเดอร์เอกสารของฉันดังนั้นนี่คือ
C:\Users\rakslice\Documents\vboxsuspend\vboxsuspend.py
- เลือกเสร็จสิ้น
ตอนนี้ VirtualBox VMs ควรถูกระงับเมื่อล็อกเอาต์ / รีสตาร์ท / ปิดเครื่อง
สคริปต์ python ในการปิดระบบอยู่ด้านล่าง:
# 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()