Fun with Conky
I like to play. I especially enjoy playing with things that end up being useful. I started out exploring Conky when I saw this thread in the Ubuntu Forums. For those unfamiliar with the program, Conky is a lightweight system monitor that displays output to your desktop. It is highly configurable. Here’s a little sample, using some colors from the Ubuntu palette.

I made this by installing Conky, and then creating a hidden file in my /home called .conkyrc with the following contents.
# set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # Use double buffering (reduces flicker, may not work for everyone) double_buffer yes # Create own window instead of using desktop (required in nautilus) own_window yes own_window_type override own_window_transparent yes own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager #own_window no #own_window_transparent no # Use Xft? use_xft yes # Xft font when Xft is enabled xftfont Liberation Mono Italic:size=8 uppercase no # Text alpha when using Xft xftalpha 0.8 # Update interval in seconds update_interval 1 # Draw shades? draw_shades no # Draw outlines? draw_outline no # Draw borders around text draw_borders no # Stippled borders? stippled_borders 10 # border margins border_margin 4 # border width border_width 1 # Text alignment, other possible values are commented #minimum_size 10 10 gap_x 13 gap_y 45 #alignment top_left alignment top_right #alignment bottom_left #alignment bottom_right # Add spaces to keep things from moving about? This only affects certain objects. use_spacer yes # Subtract file system buffers from used memory? no_buffers yes TEXT ${alignc}${color #EB5B08}$sysname kernel $kernel ${alignc}${color #EB5B08}${exec cat /etc/issue.net} on $machine host $nodename ${color #EB5B08}${execi 1000 cat /proc/cpuinfo | grep 'model name' | sed -e 's/model name.*: //'} ${color #EBA713} ${freq_dyn}Mhz ${color #EB5B08}Current CPU usage & temp:${color #EBA713} ${cpu}%${color #EB5B08}, ${color #EBA713}${acpitemp}C ${color #EB5B08}/${color #EBA713} ${acpitempf}F ${color #EB5B08}Plug/battery status:${color #EBA713} $acpiacadapter, $battery ${color #EB5B08}Load average:${color #EBA713} $loadavg ${color #EB5B08}CPU usage ${alignr}PID CPU% MEM% ${color #EBA713} ${top name 1}${alignr}${top pid 1} ${top cpu 1} ${top mem 1} ${color #EBA713} ${top name 2}${alignr}${top pid 2} ${top cpu 2} ${top mem 2} ${color #EBA713} ${top name 3}${alignr}${top pid 3} ${top cpu 3} ${top mem 3} ${color #EB5B08}Mem usage ${color #EBA713} ${top_mem name 1}${alignr}${top_mem pid 1} ${top_mem cpu 1} ${top_mem mem 1} ${color #EBA713} ${top_mem name 2}${alignr}${top_mem pid 2} ${top_mem cpu 2} ${top_mem mem 2} ${color #EBA713} ${top_mem name 3}${alignr}${top_mem pid 3} ${top_mem cpu 3} ${top_mem mem 3} ${color #EB5B08}RAM Usage:${color #EBA713} $mem/$memmax - $memperc% $membar ${color #EB5B08}Swap Usage:${color #EBA713} $swap/$swapmax - $swapperc% ${swapbar} ${color #EB5B08}Processes:${color #EBA713} $processes ${color #EB5B08}Running:${color #EBA713} $running_processes ${color #EB5B08} ${color #EB5B08}Hard disks: / ${color #EBA713}${fs_used /}/${fs_size /} ${fs_bar /} ${color #EB5B08}/home ${color #EBA713}${fs_used /home}/${fs_size /home} ${fs_bar /home} ${color #EB5B08}Wireless Networking: ${color #EB5B08}${exec iwconfig eth1 | grep "ESSID" | cut -c 11-} ${color #EB5B08}${exec iwconfig eth1 | grep "Frequency" | cut -c 25-} ${color #EB5B08}Local IP ${color #EBA713}${addr eth1} ${color #EB5B08} ${color #EB5B08}total download: ${color #EBA713}${totaldown eth1} ${color #EB5B08}total upload: ${color #EBA713}${totalup eth1} ${color #EB5B08}download speed: ${color #EBA713}${downspeed eth1} k/s${color #EBA713} ${color #EB5B08} upload speed: ${color #EBA713}${upspeed eth1} k/s ${color #EBA713}${downspeedgraph eth1 15,150 ff0000 0000ff} $alignr${color #EBA713}${upspeedgraph eth1 15,150 0000ff ff0000} ${color #EB5B08}Wired Networking: ${color #EB5B08}Local IP ${color #EBA713}${addr eth0} ${color #EB5B08} ${color #EB5B08}total download: ${color #EBA713}${totaldown eth01} ${color #EB5B08}total upload: ${color #EBA713}${totalup eth0} ${color #EB5B08}download speed: ${color #EBA713}${downspeed eth0} k/s${color #EBA713} ${color #EB5B08} upload speed: ${color #EBA713}${upspeed eth0} k/s ${color #EBA713}${downspeedgraph eth0 15,150 ff0000 0000ff} $alignr${color #EBA713}${upspeedgraph eth0 15,150 0000ff ff0000} ${color #EB5B08}Public IP ${color #EBA713}${execi 3600 curl 'http://www.whatismyip.org'} ${color #EB5B08}Port(s) / Connections: ${color #EB5B08}Inbound: ${color #EBA713}${tcp_portmon 1 32767 count} ${color #EB5B08}Outbound: ${color #EBA713}${tcp_portmon 32768 61000 count} ${color #EB5B08}Total: ${color #EBA713}${tcp_portmon 1 65535 count} ${color #EB5B08}Outbound Connection ${alignr} Remote Service/Port${color #EBA713} ${tcp_portmon 32768 61000 rhost 0} ${alignr} ${tcp_portmon 32768 61000 rservice 0} ${tcp_portmon 32768 61000 rhost 1} ${alignr} ${tcp_portmon 32768 61000 rservice 1} ${tcp_portmon 32768 61000 rhost 2} ${alignr} ${tcp_portmon 32768 61000 rservice 2} ${tcp_portmon 32768 61000 rhost 3} ${alignr} ${tcp_portmon 32768 61000 rservice 3} ${tcp_portmon 32768 61000 rhost 4} ${alignr} ${tcp_portmon 32768 61000 rservice 4} ${tcp_portmon 32768 61000 rhost 5} ${alignr} ${tcp_portmon 32768 61000 rservice 5}
One of my favorite things with Conky is that I can write a shell script and have Conky execute it, like using this .conkyrc for a weather report, combined with the script that follows.
# set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # Use double buffering (reduces flicker, may not work for everyone) double_buffer yes # Create own window instead of using desktop (required in nautilus) own_window yes own_window_type override own_window_transparent yes own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager #own_window no #own_window_transparent no # Use Xft? use_xft yes # Xft font when Xft is enabled xftfont Liberation Mono Italic:size=8 uppercase no # Text alpha when using Xft xftalpha 0.8 # Update interval in seconds update_interval 1 # Draw shades? draw_shades no # Draw outlines? draw_outline no # Draw borders around text draw_borders no # Stippled borders? stippled_borders 10 # border margins border_margin 4 # border width border_width 1 # Text alignment, other possible values are commented #minimum_size 10 10 gap_x 13 gap_y 40 #alignment top_left #alignment top_right alignment bottom_left #alignment bottom_right # Add spaces to keep things from moving about? This only affects certain objects. use_spacer yes # Subtract file system buffers from used memory? no_buffers yes TEXT ${color #EB5B08}Local weather: ${color #EBA713} ${execi 1800 /home/matt/conky/weather.sh MOXX0003}
Script:
#!/bin/sh # # Grab weather data from weather.com and format it according to the given XSLT # Script written by boojit # Modified by Hellfire # Modified again by matthew # The orignal script and xslt can be downloaded from http://pondol.com/weather.tar.gz # Usage: # ${execi 1800 /path/to/weather/weather.sh location} # Usage example (Fes, Morocco): # ${execi 1800 /home/user/weather/weather.sh MOXX0003} # your Location ID: use http://xoap.weather.com/search/search?where=yourcity to find it # U.S. users can just use their zip code; doubt that works for anyone else though (YMMV) LOCID=$1 # s=standard units, m=metric units UNITS=s # where this script and the XSLT lives RUNDIR=/home/matt/conky # there's probably other stuff besides CURL that will work for this, but i haven't # tried any others. # you can get curl at http://curl.haxx.se/ CURLCMD=/usr/bin/curl # get it at http://xmlsoft.org/XSLT/ XSLTCMD=/usr/bin/xsltproc # you probably don't need to modify anything below this point.... # CURL url. Use cc=* for current forecast or dayf=10 to get a multi-day forecast CURLURL="http://xoap.weather.com/weather/local/$LOCID?cc=*&unit=$UNITS&dayf=2" # The XSLT to use when translating the response from weather.com # You can modify this xslt to your liking XSLT=$RUNDIR/weather.xslt #filter (if you want to convert stuff to lower-case or upper case or something) #FILTER="|gawk '{print(tolower(\$0));}'" ##### eval "$CURLCMD \"$CURLURL\" 2>/dev/null| $XSLTCMD $XSLT - $FILTER"
Which requires this configuration file that is named weather.xslt
<!-- This XSLT is used to translate an XML response from the weather.com XML API. You can format this file to your liking. Two things you may feel like doing: 1) Modify the layout of the fields or static text already defined 2) Add other fields from the XML response file that aren't referenced in this XSLT. You can grab a full list by just doing a: wget "http://xoap.weather.com/weather/local/$LOCID?cc=*&unit=$UNITS" (change $LOCID and $UNITS to suit your needs) File modified by matthew --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:output method="text" disable-output-escaping="yes"/> <xsl:template match="weather"> <xsl:apply-templates select="cc"/> <xsl:apply-templates select="dayf/day@d='1'"/> </xsl:template> <xsl:template match="cc"> <xsl:value-of select="obst"/> <xsl:text> at </xsl:text><xsl:value-of select="lsup"/><xsl:text> </xsl:text> <xsl:text> Temperature: </xsl:text><xsl:value-of select="tmp"/><xsl:value-of select="/weather/head/ut"/> <xsl:if test="tmp != flik"> <xsl:text> Feels Like: </xsl:text><xsl:value-of select="flik"/><xsl:value-of select="/weather/head/ut"/> </xsl:if> <xsl:text> Conditions: </xsl:text><xsl:value-of select="t"/> <xsl:text> Wind: </xsl:text> <xsl:choose> <xsl:when test="wind/s = 'calm'"><xsl:text>0</xsl:text></xsl:when> <xsl:otherwise><xsl:value-of select="wind/s"/></xsl:otherwise> </xsl:choose> <xsl:value-of select="/weather/head/us"/> <xsl:choose> <xsl:when test="wind/s = 'calm'"><xsl:text>(0mph)</xsl:text></xsl:when> <xsl:otherwise><xsl:text> </xsl:text></xsl:otherwise> </xsl:choose> <xsl:text> (</xsl:text><xsl:value-of select="wind/t"/><xsl:text>)</xsl:text> <xsl:text> Humidity: </xsl:text><xsl:value-of select="hmid"/><xsl:text> % Barometer: </xsl:text><xsl:value-of select="bar/d"/> </xsl:template> <xsl:template match="dayf/day@d='1'"> <xsl:text> Tomorrow: </xsl:text><xsl:value-of select="low"/><xsl:value-of select="/weather/head/ut"/> <xsl:text> to </xsl:text><xsl:value-of select="hi"/><xsl:value-of select="/weather/head/ut"/> <xsl:text>, </xsl:text><xsl:value-of select="part@p='d'/t"/> <xsl:text> </xsl:text><xsl:value-of select="/weather/swa/a/t"/> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
And ultimately produces output like this

Something else that is fun is that I can run more than one instance of Conky at a time. To run both of these concurrently, I deleted the .conkyrc file and created a startup script that calls each of these configurations in separate Conky instances.
#!/bin/bash sleep 20 && exec conky -d -c ~/conky/conkyrc_main & sleep 22 && exec conky -d -c ~/conky/conkyrc_weather & exit
I have the long delay there because I call the script from GNOME (System->Preferences->Sessions, Startup Programs). The delay gives time for GNOME to get started and for my wireless ethernet connection to get set up before the script runs.
Have fun playing!
21 comments October 6th, 2007
