shell 如何获取每个vncviewer后台进程的会话号并将其存储在不同的变量中

j2cgzkjk  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(158)

我很喜欢玩FreeBSD里的bhyve虚拟机,大家可能都知道,有时候虚拟机加载的OS死机了,虚拟机的进程并没有被杀死,这不是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

在本例中,我有两个虚拟机,分别称为vm2vm4,它们变成了ghost,因为它们内部的操作系统已经停止。为了清楚起见,我想向您展示我通常用来启动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

现在,由于没有任何简单方法可以知道虚拟机是Ghost还是正在运行,我考虑了这样一个系统:

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

grepping vncviewer会话号是确定哪个虚拟机真正在运行的最安全的方法,因为当虚拟机真正在运行时,我从不关闭vncviewer窗口,而是最小化其窗口,并且由于我已将相同的编号与虚拟机和vncviewer会话关联,我确定vm2vm4还在运行,当我停止vm2vm4的时候,对应的vnc会话应该是关闭的,现在,我想做的是创建一个脚本,在这种情况下,作为输出,它能够给予我24。因此,脚本应该将数字2赋给第一个变量,将数字4赋给第二个变量:

$runvm1 = 2
$rvnvm2 = 4

以后我会这样完成脚本:

bhyvectl --vm=$runvm1 --force-reset
bhyvectl --vm=$runvm1 --destroy
bhyvectl --vm=$runvm2 --force-reset
bhyvectl --vm=$runvm2 --destroy

因为我希望重置并销毁在以下列出的进程之间仍然可见的所有Ghost虚拟机:

mario@marietto:/home/marietto # ps ax | grep bhyve
62lalag4

62lalag41#

这将获得您的值。

#!/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
    }'

相关问题