服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-21 简米科技 3,541 字 8 分钟阅读

如何用命令批量关闭多台虚拟机不影响服务?,虚拟机批量关机命令怎么用

导读先把所有待关闭虚拟机按依赖关系排好顺序,再通过宿主机或管理平台的命令行接口执行批量关机脚本,同时跳过不需要关机的虚拟机,从而保证业务连续性不受影响,虚拟机批量关闭命令的核心思路批量关闭多台虚拟机,听起来像是把电源键挨个按过去,但实操中,命令行的做法要讲究得多,直接对宿主机执行重启或关机命令,所有虚拟机都会一起断……

先把所有待关闭虚拟机按依赖关系排好顺序,再通过宿主机或管理平台的命令行接口执行批量关机脚本,同时跳过不需要关机的虚拟机,从而保证业务连续性不受影响。


虚拟机批量关闭命令的核心思路

批量关闭多台虚拟机,听起来像是把电源键挨个按过去,但实操中,命令行的做法要讲究得多,直接对宿主机执行重启或关机命令,所有虚拟机都会一起断电,这属于"物理关闭",对跑着数据库、缓存或消息队列的机器来说,等于直接拔插头,正确的思路是通过管理接口,逐台发送优雅关机指令,让客户机系统完成文件系统同步、服务正常下线后再断电。

这个思路落地到具体工具上,主要有三个层面:

  • 宿主机命令行:在ESXi或KVM宿主机上直接操作,适合虚拟机数量几十台以内的场景
  • 集中管理平台:如vCenter或Proxmox VE,适合跨多台宿主机、需要并行控制的场景
  • 脚本自动化:基于以上两种方式封装成循环脚本,处理批量、筛选、异常重试等逻辑

关键点在于筛选出目标虚拟机,而不是"全部关机",多数情况下,一套环境里的虚拟机分属不同业务组,有些需要停机维护,有些则要7x24小时在线,用命令行批量操作时,首先要通过名称前缀、标签或自定义属性把目标机器精确圈出来。

esxi批量关闭虚拟机命令有哪些

VMware ESXi是使用率较高的虚拟化平台之一,这里单独拆开讲,因为网上流传的命令版本比较混乱,容易误导人。

ESXi批量关机主要有三条路:SSH到ESXi宿主机上敲esxcli命令、在vCenter上用PowerCLI批量执行、以及用esxcli配合脚本循环处理,三条路各有适用场景,下面分别展开。

通过esxcli命令直接操作

ESXi宿主机开了SSH服务后,登录进去执行:

esxcli vm list | grep $(筛选条件)  # 先找出目标虚拟机
esxcli vm process shutdown --type=soft --vmname=虚拟机名

软关机的type参数有三个:soft请求客户机系统内正常关机,hard模拟按下电源键强制关闭,force直接注销进程,日常批量操作,优先使用soft,只在客户机系统无响应时才用hard。

用PowerCLI在vCenter上批量执行

如果虚拟机分散在多台ESXi宿主机上,逐个SSH就非常低效,更常见的操作方式是,在装有PowerCLI的Windows跳板机或Linux机器上连接vCenter:

Connect-VIServer -Server vcenter.example.com -User admin -Password $password
Get-VM -Name "web-" | Shutdown-VM -Confirm:$false

这条命令的关键在于-Name参数支持通配符,能够一次性匹配前缀相同的所有虚拟机,如果需要更精确的筛选条件,还可以组合Get-Tag和Get-VM:

Get-Tag -Name "临时维护" | Get-VM | Shutdown-VM -Confirm:$false

行业共识认为,PowerCLI这种方式适合批量100台以上的场景,脚本如果写得好,还带有自动等待关机完成和超时重试机制,比在SSH里写循环更便于管理维护。(据VMware官方文档,Shutdown-VM支持并发批量执行)

批量命令脚本示例

实际工作中用得较多的,是先把虚拟机列表导出为文本文件,然后用for循环逐行读取并执行关机:

esxcli vm list > vm_list.txt
for vm in $(grep -i "需关机的模式" vm_list.txt)
do
  esxcli vm process shutdown --type=soft --vmname="$vm" --timeout=120
  sleep 5
done

这个脚本的--timeout=120参数很实用,它表示等待客户机系统响应的时间上限,超时未响应则自动跳过,这样避免了某台系统卡住,导致后面所有虚拟机都被堵住的情况,执行完毕后再跑一次esxcli vm list确认已关机的列表,做到闭环收尾。

批量关闭虚拟机不影响其他服务怎么做

这个问题的核心不是"怎么敲命令",而是如何保证被关的那批虚拟机,不影响那些还在运行的业务,下面按实操顺序拆开讲。

第一步:梳理依赖关系

开批量关机脚本前,先梳理目标虚拟机和常驻虚拟机之间的依赖关系,业内专家指出,多数业务故障出在资源依赖,而不是关机操作本身。

先回答三个问题:

  • 有没有数据库、缓存或配置中心运行在本次要关的虚拟机里?如果有,哪些服务依赖它?
  • 这些依赖服务的调用方是否配置了熔断或者重试,能否忍受短暂不可用?
  • 本次要关的虚拟机之间,有没有先后依赖?比如应用服务器依赖认证服务先关闭、后启动?

确认以上问题后,形成一个明确的关机顺序列表,依赖别人关的机器排在最前面,作为被依赖者(例如数据库)排在最后断电。

第二步:使用维护模式或网络隔离

多集群场景里,同一批虚拟机可能分布在多台物理宿主机上,批量关机前,建议先通过vmotion或migrate命令,把常驻虚拟机迁移到其他宿主机上,再只对目标宿主机执行关机,这样避免了因为宿主机负载过高导致其他虚拟机出现性能抖动。

如果是单机场景,可以在防火墙或交换机上把待关机的虚拟机网卡临时关闭,让外部流量自然切到其他机器,这样一来,即使这台虚拟机关机过程比较慢,外部请求也不会因为连接超时产生告警风暴。

第三步:快照与备份检查

批量关停前,顺手检查目标虚拟机有没有未完成的快照,虚机挂着快照时强行关机,启动后可能出现磁盘状态不一致,严重时快照链会被破坏,如果快照时间比较新,建议先合并快照再关机:

Get-VM -Name "app-" | Get-Snapshot | Remove-Snapshot -Confirm:$false

合并不需要太长时间,但能换来安全性的大幅提升。

第四步:执行批量关机并盯紧状态

执行批量关机命令后,不要直接去喝咖啡,至少盯一轮状态确认。

watch -n 10 "esxcli vm list"

watch命令会每10秒刷新一次虚拟机列表,能直观看到机器状态从"Running"变成"Powered Off",出现长时间停在同一台不动的情况,可以手动检查客户机系统内部是否卡在某个服务的停止环节。

常见踩坑点

批量关机这个操作,做得多了之后,容易忽略一些很基础的东西,下面几个比较典型:

  • 忘掉关联的安全组策略:部分环境里,虚拟机下线会自动触发监控告警或安全策略联动,建议提前通知运维值班同学
  • 不检查未保存的配置:如果虚拟机有未写入磁盘的内存改动,软关机可能等待较长时间,甚至一直等待
  • 并发数设置过猛:一次并发关闭几十台虚拟机,每台都往存储控制器发送大量写操作,可能导致存储延迟飙升,进而影响其他正常虚拟机

批量关闭虚拟机的常见问题有哪些

Q:批量关机时,能不能只关一部分虚拟机而不影响同宿主机的其他虚拟机?
A:完全可以,批量关机操作针对的是虚拟机实例,而不是宿主机,因此同宿主机上没有被选中的虚拟机不会受到影响,但如果宿主机资源本身吃紧,批量关机过程中存储或网络I/O波动仍可能给同宿主机的其他虚拟机带来短暂的性能影响,关闭全部目标虚拟机后,并不会改变宿主机上留存虚拟机的运行状态。

Q:KVM平台有哪些批量关闭虚拟机的命令?
A:KVM平台下主要使用virsh工具配合脚本完成批量操作,首先通过virsh list --all获取虚拟机列表,然后使用脚本循环执行virsh shutdown,virsh shutdown支持软关机,但重启或强制关机的参数是virsh destroy,脚本效果好,前提是虚拟机内安装了qemu-guest-agent装饰,即客户机关机必须走系统机制。

Q:如何避免误关不该关的虚拟机?
A:最稳妥的做法是在脚本里加入二次匹配验证,先执行筛选命令,将匹配到的虚拟机列表输出到一个临时文件,人工检查或使用脚本自动对照白名单,PowerCLI脚本中可以先把Get-VM查到的名字集合和允许关机的名单做差集,如果差集不为空,立即中断操作并输出告警,这种方法可以避免因为前缀匹配过宽而导致误关测试环境或生产必经节点。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱