Skip to main content

memory - How to save in XML/JSON format all information from “free” command and “vmstat” command including time?


I need it every 2 minutes:


command


I am using Debian (text mode only).



Answer




Assuming you don't want individual tags for total, used, free shared etc, you can wrap the whole output in enclosing tags, as appropriate:


XML


The following script could be saved as (eg) memoryinfo-xml.sh:


#!/bin/bash
# memoryinfo-xml.sh - wrap output of free + vmstat in XML tags
echo ""
echo -e "\t$(date)"
echo -e "\t$(free)"
echo -e "\t$(vmstat)"
echo "
"

example output:


                                                                                                          
Thu 30 Mar 16:21:18 BST 2017
total used free shared buffers cached
Mem: 3853532 3721596 131936 100868 227652 3024584
-/+ buffers/cache: 469360 3384172
Swap: 1182716 2512 1180204

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 2512 132084 227652 3024584 0 0 3 2 4 4 1 0 99 0 0



As you can see, it isn't exactly pretty!


JSON


Very similar to before, save as (eg) memoryinfo-json.sh:



#!/bin/bash
# memoryinfo-json.sh - wrap output of free + vmstat in json
# thanks to https://stackoverflow.com/a/1252191 for \n replacement
echo "{ \"output\":"
echo -e "\t { \"date\": \"$(date)\", "
echo -e "\t \"free\": \"$(free | sed ':a;N;$!ba;s/\n/||/g')\", "
echo -e "\t \"vmstat\": \"$(vmstat| sed ':a;N;$!ba;s/\n/||/g')\" "
echo "}"

example output:



{
"output": {
"date": "Thu 30 Mar 16: 48: 51 BST 2017",
"free": "total used free shared buffers cached || Mem: 3853532 3722428 131104 100868 227888 3024844 || -/+ buffers/cache: 469696 3383836 || Swap: 1182716 2512 1180204",
"vmstat": "procs-- -- -- -- -- - memory-- -- -- -- -- -- - swap-- -- -- - io-- -- - system-- -- -- --cpu-- -- - || r b swpd free buff cache si so bi bo in cs us sy id wa st || 1 0 2512 131096 227888 3024844 0 0 3 2 4 4 1 0 99 0 0"
}
}

Note that to get valid JSON, the newlines have been replaced by a double pipe character (||), via sed replacement.


Comments