如何通过Bash脚本批量打开多个virt-viewer虚拟机窗口
问题原因
这是前台进程阻塞导致的。virt-viewer默认以前台模式运行,加了--wait参数后会一直占用终端等窗口关闭才退出,脚本按顺序执行命令时,第一条跑起来之后就会卡住,等第一个窗口关闭才会执行第二条,自然只能打开一个窗口。之前用bash -c、/bin/sh -ce包裹命令本质上还是前台运行,没有解决阻塞问题,所以不生效。
解决方法
方法1:加&丢后台运行(最省事)
每条命令末尾加&,把virt-viewer进程放到后台执行,脚本就不会被单条命令阻塞,会顺次拉起所有配置的窗口:
#!/bin/bash virt-viewer --connect qemu:///session --wait vm-bigfg-1 & virt-viewer --connect qemu:///session --wait vm-nexus-1 & virt-viewer --connect qemu:///session --wait 其他虚拟机名 &
如果不想看到后台进程打印的日志,可以把输出重定向到空设备:
#!/bin/bash virt-viewer --connect qemu:///session --wait vm-bigfg-1 >/dev/null 2>&1 & virt-viewer --connect qemu:///session --wait vm-nexus-1 >/dev/null 2>&1 & virt-viewer --connect qemu:///session --wait 其他虚拟机名 >/dev/null 2>&1 &
把内容保存为脚本文件(比如open_vms.sh),执行chmod +x open_vms.sh添加执行权限,直接运行即可。
方法2:nohup启动(关闭终端不影响窗口)
如果需要启动完窗口就关闭执行脚本的终端,不想连带关闭virt-viewer窗口,可以用nohup包裹命令再放到后台:
#!/bin/bash nohup virt-viewer --connect qemu:///session --wait vm-bigfg-1 >/dev/null 2>&1 & nohup virt-viewer --connect qemu:///session --wait vm-nexus-1 >/dev/null 2>&1 & nohup virt-viewer --connect qemu:///session --wait 其他虚拟机名 >/dev/null 2>&1 &
进阶自动脚本
不想每次手动维护虚拟机列表的话,可以写循环自动读取所有处于运行状态的虚拟机,批量打开对应窗口:
#!/bin/bash # 拉取所有running状态的虚拟机名称 vm_list=$(virsh list --state-running --name) for vm_name in $vm_list do # 变量加双引号兼容带空格的虚拟机名 nohup virt-viewer --connect qemu:///session --wait "$vm_name" >/dev/null 2>&1 & done
*如果使用系统级KVM连接,把命令里的qemu:///session替换为qemu:///system即可。
内容的提问来源于stack exchange,提问作者searchbruh
相关产品推荐
相关产品推荐

