Using bash and watch to monitor qemu-kvm

1.1k views Asked by At

I'm trying to monitor some qemu-kvm processes using a bash script and watch to show several details like memory/cpu use, resources, ports,etc. Everything is going great until I try to get the IMG file that qemu-kvm is using.

Initially I thought I could get that information from the running process cmd:

ps -p PID -o cmd | tail -1
qemu-kvm -name TEST -drive file=/img/test.qcow2,if=ide,media=disk,cache=none -daemonize

So after plenty of tests I have wrote this little script just to synthesise the problem:

#!/bin/bash
lsof -p PID | grep '/img/' | awk {'print $9'}

The output of this script looks totally fine when I execute it from the command line:

bash testscript
/img/test.qcow2

The problem comes when I try to run the script along with watch:

watch -n1 "bash test-script" or watch -n1 ./test-script

The output is just empty...

Why don't I get any results? I'd be really glad if somebody can help me understanding this.

EDIT: I have found an alternative solution. I am now getting the information from parsing the procfs with some arrays to find the IMG info:

OIFS=$IFS;
IFS='-';  
Array=($(cat /proc/PID/cmdline))
    for ((i=0; i<${#Array[@]}; ++i))
        do
        if [[ "${Array[$i]}" == *drive* ]]; then
            image=${Array[$i]}
            echo $image
        fi
    done
IFS=$OIFS;

This works fine combined with watch, but I would still like to know what's the problem with the other method. Is lsof limited somehow??

1

There are 1 answers

0
Goblinhack On

I tried the same process as you; the only difference in my case was the need for sudo. With that it worked. Same issue?

#!/bin/sh
sudo lsof | grep .B.disk.img

watch -n1 sh test