如何获取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
相关产品推荐
相关产品推荐

