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??
I tried the same process as you; the only difference in my case was the need for sudo. With that it worked. Same issue?