我非常喜欢使用FreeBSD中的bhyve虚拟机。您可能知道,当虚拟机加载的操作系统停止时,虚拟机的进程不会被终止。这不是一个bug,但是开发人员说,这样可以加快虚拟机的启动过程。现在,我想创建一个脚本来杀死“死”虚拟机,这些虚拟机在我执行"ps ax \ grep bhyve“时仍然列出,但是不能再使用了。让我们以下面的例子为例:
mario@marietto:/home/marietto # ps ax | grep bhyve
13720 - Is 0:00.00 bhyve: system.pwd (bhyve)
13721 - Is 0:00.00 bhyve: system.grp (bhyve)
13831 - Ss 0:00.00 bhyve: system.pwd (bhyve)
13832 - Ss 0:00.00 bhyve: system.grp (bhyve)
13826 4 SC+ 0:17.34 bhyve: vm2 (bhyve)
13715 1 IC+ 1:00.55 bhyve: vm4 (bhyve)
13852 3 S+ 0:00.00 grep bhyve在本例中,我有两个虚拟机,名为vm2和vm4,它们变成了幽灵,因为它们中的os已经停止。为了明确起见,我想向您展示我通常用来启动bhyve vm的脚本是怎样的:
bhyve -S -c sockets=2,cores=2,threads=2 -m 8G -w -H -A \
-s 0,hostbridge \
-s 1,nvme,/dev/nvd0,bootindex=1 \
-s 2,virtio-blk,/dev/$vmdisk4 \
-s 3,virtio-blk,/dev/$vmdisk8 \
-s 4,virtio-blk,/dev/$vmdisk11 \
-s 10,virtio-net,tap2 \
-s 11,virtio-9p,sharename=/ \
-s 12,hda,play=/dev/dsp,rec=/dev/dsp \
-s 29,fbuf,tcp=0.0.0.0:5902,w=1600,h=950 \
-s 30,xhci,tablet \
-s 31,lpc \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_BHF_CODE.fd \
vm2 < /dev/null & sleep 2 && vncviewer 0:2现在,由于没有任何简单的方法可以知道虚拟机是鬼还是正在运行,所以我想到这样的系统:
mario@marietto:/home/marietto # ps ax | grep vnc
13841 4 S+ 0:00.03 vncviewer 0:2
13727 1 S+ 0:00.04 vncviewer 0:4
13854 3 S+ 0:00.00 grep vnc查看器会话号是确定哪个虚拟机真正运行的最安全的方法,因为当虚拟机真正运行时,我从未关闭vncviewer窗口,但我最小化了它的窗口,而且由于我将相同的数字关联到虚拟机和vncviewer会话,所以我确信vm2和vm4仍然在运行。当我将停止vm2和vm4时,应该确保关闭相应的vnc会话。现在,我要做的是创建一个脚本,在这种情况下,作为输出可以为我提供2和4。因此,脚本应该将数字2分配给第一个变量,将number 4分配给第二个变量:
$runvm1 = 2
$rvnvm2 = 4稍后,我将像这样完成脚本:
bhyvectl --vm=$runvm1 --force-reset
bhyvectl --vm=$runvm1 --destroy
bhyvectl --vm=$runvm2 --force-reset
bhyvectl --vm=$runvm2 --destroy因为我希望重置和销毁所有仍在列出的进程之间可见的鬼虚拟机:
mario@marietto:/home/marietto # ps ax | grep bhyve发布于 2022-09-18 18:47:22
这会得到你的价值。
#!/bin/sh
BASE=`basename "$0" ".sh" `
TMP="/tmp/tmp.$$.${BASE}"
echo "
mario@marietto:/home/marietto # ps ax | grep bhyve
13720 - Is 0:00.00 bhyve: system.pwd (bhyve)
13721 - Is 0:00.00 bhyve: system.grp (bhyve)
13831 - Ss 0:00.00 bhyve: system.pwd (bhyve)
13832 - Ss 0:00.00 bhyve: system.grp (bhyve)
13826 4 SC+ 0:17.34 bhyve: vm2 (bhyve)
13715 1 IC+ 1:00.55 bhyve: vm4 (bhyve)
13799 8 IC+ 1:00.55 bhyve: abc_vm4 (bhyve)
13852 3 S+ 0:00.00 grep bhyve
" >${TMP}.testinput
cat "${TMP}.testinput" | grep '(bhyve)' |
awk '{
if( $6 ~ /^vm/ ){
id=substr( $6, 3 ) ;
printf("%s|%s|%s\n", id, $6, $1 ) ;
} ;
### Sample output:
### 2|vm2|13826
### 4|vm4|13715
}' |
awk -F \| 'BEGIN{ indx=0 ; }{
indx++
printf("runvm"indx" = %s\n", $1 ) ;
### Sample output:
### runvm1 = 2
### runvm2 = 4
}'https://stackoverflow.com/questions/73514049
复制相似问题