You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取vncviewer后台会话号并清理FreeBSD上的bhyve幽灵虚拟机

提取VNC会话号并清理幽灵Bhyve虚拟机

一、提取活跃VNC会话号

从ps输出中筛选vncviewer进程并提取会话号,用awk可以直接完成解析:

# 过滤出vncviewer进程,提取冒号后的会话号,排除grep自身进程
ps ax | awk '/vncviewer/ && !/grep/ {split($NF, arr, ":"); print arr[2]}'

命令说明:

  • /vncviewer/ && !/grep/:仅保留包含vncviewer的进程行,排除grep进程
  • split($NF, arr, ":"):将进程的最后一个参数(如0:2)按冒号分割为数组
  • print arr[2]:输出分割后的第二个元素,即目标会话号(如示例中的2、4)

二、将会话号存入变量

推荐用数组存储(更适合批量处理)

如果有多个会话,数组比单个命名变量更灵活:

# 把提取到的会话号存入数组
active_vnc_sessions=($(ps ax | awk '/vncviewer/ && !/grep/ {split($NF, arr, ":"); print arr[2]}'))

查看数组内容可执行:

echo "${active_vnc_sessions[@]}"

输出示例:2 4

存入单个命名变量(如runvm1、runvm2)

如果必须按需求命名单个变量,可通过循环赋值:

index=1
for session in "${active_vnc_sessions[@]}"; do
    declare "runvm$index"="$session"
    index=$((index + 1))
done

之后可直接调用$runvm1、$runvm2等变量。

三、批量清理幽灵虚拟机

结合数组批量处理对应虚拟机:

for session in "${active_vnc_sessions[@]}"; do
    vm_name="vm$session"
    echo "开始清理幽灵虚拟机:$vm_name"
    bhyvectl --vm="$vm_name" --force-reset
    bhyvectl --vm="$vm_name" --destroy
    echo "虚拟机 $vm_name 清理完成"
done

完整脚本示例

#!/bin/sh

# 提取活跃VNC会话号
active_vnc_sessions=($(ps ax | awk '/vncviewer/ && !/grep/ {split($NF, arr, ":"); print arr[2]}'))

# 检查是否有需要清理的虚拟机
if [ ${#active_vnc_sessions[@]} -eq 0 ]; then
    echo "没有找到需要清理的幽灵虚拟机"
    exit 0
fi

# 批量执行清理操作
for session in "${active_vnc_sessions[@]}"; do
    vm_name="vm$session"
    echo "正在处理虚拟机:$vm_name"
    bhyvectl --vm="$vm_name" --force-reset
    bhyvectl --vm="$vm_name" --destroy
    echo "$vm_name 已销毁"
done

内容的提问来源于stack exchange,提问作者john_connor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:54:25