FreeBSD Desktop – Part 13 – Configuration – Dzen2

Time for real configuration of the status bar. In today’s article of the FreeBSD Desktop series I will describe how to configure the Dzen2.

You may want to check other articles in the FreeBSD Desktop series on the FreeBSD Desktop – Global Page where you will find links to all episodes of the series along with table of contents for each episodeโ€™s contents.


The provided status bar backed by Dzen2 will be providing the following information.

  • date: Date in ISO 8601 format along with current time.
  • sys: CPU frequency, CPU temperature, system load and free RAM.
  • ip: List of current IP addresses and its interfaces.
  • gw: System default network gateway.
  • dns: System default DNS.
  • ping: Current Internet access state.
  • vol/pcm: Volume level for vol and pcm backends.
  • fs: ZFS pools free space.
  • bat: Battery and AC status.
  • top: Top 3 processes with highest CPU usage along with their RAM usage.

Here is how such Dzen2 looks like in action.



The Dzen2 offers feature that Conky or other status bar applications does not offer. I would call it refresh on demand. If you would like to implement refresh interval of 60 seconds for example (not so often) and also refresh that information everytime you ‘click’ on the status bar (or by other action) its possible to implement in Dzen2 using mkfifo(1) command.

Why anyone would want to implement such ‘strange’ refresh policy? To get more battery life mostly as You do not need this information to be refreshed every second and if You need up to date information then you will refresh it manually with a click on the status bar and have the needed information. The other reason is ‘focus’. If this status bar refreshes every second, then it ‘caches’ your attention, this may prevent you from focusing deep enough on the task you are currently doing. If you do something important that requires focus then You do not want status bar (or anything else) to distract you with useless at the moment information.

To achieve such configuration we would need three things. The script that will start initial fifo on the ~/.dzen2-fifo file. The to update the fifo and would be run from the crontab(1) every 60 seconds. A dzen2(1) action configured with left mouse button click to invoke to update the fifo. All these scripts and scripts used directly by Dzen2 to gather needed information are available in the scripts-status-bar.tar.gz file.

To start Dzen2 at the X11 startup we will use script from the earlier ‘bulk’ already available – – which kills all instances of Dzen2 and then starts the fifo backed Dzen2 with script available in the scripts.tar.gz file.

Here is how its configured in the ~/.xinitrc (or ~/.xsession) file.

% grep dzen ~/.xinitrc                      
  ~/scripts/ &

Remember to put ‘&‘ at the end of the line.

Lets have a look how the ‘update’ is configured in the crontab(1) as shown below.

% crontab -l
  0 * * * * ~/scripts/ 1> ~/.dzen2-fifo                                        2> /dev/null

The scripts that Dzen2 uses to gather information are:


… and this one to ’emulate’ clicks to implement Openbox virtual desktops switching with [Scroll Up] and [Scroll Down] mouse events.


The is kinda like Conky on terminal, it just puts all that information in text format with Dzen2 colors syntax as shown below.

 ^fg(#aaaaaa)date: ^fg(#eeeeee)2018/07/05/Thu/10:11 ^fg(#dd0000)| ^fg(#aaaaaa)sys: ^fg(#eeeeee)800MHz/46.1C/0.83/4.5GB ^fg(#dd0000)| ^fg(#aaaaaa)ip: ^fg(#eeeeee)wlan0/wirelesssid/ ^fg(#dd0000)| ^fg(#aaaaaa)gw: ^fg(#eeeeee) ^fg(#dd0000)| ^fg(#aaaaaa)dns: ^fg(#eeeeee) ^fg(#dd0000)| ^fg(#aaaaaa)ping: ^fg(#eeeeee)^fg(#dd2200)NOPE ^fg(#dd0000)| ^fg(#aaaaaa)vol/pcm: ^fg(#eeeeee)100/100 ^fg(#dd0000)| ^fg(#aaaaaa)fs: ^fg(#eeeeee)local/69.2G sys/3.27G ^fg(#dd0000)| ^fg(#aaaaaa)bat: ^fg(#eeeeee)AC/^fg(#ffffff)90% ^fg(#dd0000)| ^fg(#aaaaaa)top: ^fg(#eeeeee)firefox/15%/0.6GB firefox/13%/0.3GB firefox/11%/0.4GB 


To make most scripts work Your user (vuk in the series) needs to be in the wheel, operator and network groups and doas(1) (sudo(8) equivalent) needs to be installed and configured in the following way.

# pkg install doas

# pw groupmod wheel    -m vuk
# pw groupmod operator -m vuk
# pw groupmod network  -m vuk

# cat /usr/local/etc/doas.conf
permit nopass :wheel as root

permit nopass :network as root cmd ifconfig
permit nopass :network as root cmd dhclient
permit nopass :network as root cmd umount
permit nopass :network as root cmd wpa_supplicant
permit nopass :network as root cmd ppp
permit nopass :network as root cmd killall args -9 dhclient
permit nopass :network as root cmd killall args -9 wpa_supplicant
permit nopass :network as root cmd killall args -9 ppp
permit nopass :network as root cmd cat args /etc/ppp/ppp.conf
permit nopass :network as root cmd /etc/rc.d/netif args onerestart
permit nopass :network as root cmd tee args /etc/resolv.conf
permit nopass :network as root cmd tee args -a /etc/resolv.conf


In this post I attach scripts related to Dzen2. Download them all in the scripts-status-bar.tar.gz file and unpack them into the ~/scripts directory.

Here are these scripts.

% tar -tf scripts-status-bar.tar.gz

Make sure they remain executable.

% chmod +x ~/scripts/*

To make them work properly add ~/scripts into the ${PATH} variable at the beginning of the ~/.xinitrc file.

  export PATH=${PATH}:~/scripts

All of my scripts have this ‘mysterious’ line at the end. Its for statistics to check which scripts are run when (or it at all to which ones to delete).

echo '1' >> ~/scripts/stats/$( basename ${0} )

Thus it is needed to create the ‘stats’ directory.

% mkdir -p ~/scripts/stats

I have implemented that about two months ago and here are the results.

% wc -l ~/scripts/stats/* | sort -n
       1 /home/vermaden/scripts/stats/
       2 /home/vermaden/scripts/stats/
       2 /home/vermaden/scripts/stats/
       2 /home/vermaden/scripts/stats/
       4 /home/vermaden/scripts/stats/
       4 /home/vermaden/scripts/stats/
       5 /home/vermaden/scripts/stats/
       5 /home/vermaden/scripts/stats/
       5 /home/vermaden/scripts/stats/
       6 /home/vermaden/scripts/stats/
       7 /home/vermaden/scripts/stats/
       8 /home/vermaden/scripts/stats/
      12 /home/vermaden/scripts/stats/
      16 /home/vermaden/scripts/stats/
      16 /home/vermaden/scripts/stats/
      22 /home/vermaden/scripts/stats/
      24 /home/vermaden/scripts/stats/
     214 /home/vermaden/scripts/stats/
     960 /home/vermaden/scripts/stats/
    2767 /home/vermaden/scripts/stats/
   13834 /home/vermaden/scripts/stats/
   17916 total

Of course I limited the output only to scripts that are available in this article, but be patient, more to come later ๐Ÿ™‚


To make these scripts work and generally to make all this setup work we will need these dependencies.

  • dzen2
  • xdotool
  • wmctrl

To install them all with pkg(8) just type this line below.

# pkg install dzen2 xdotool wmctrl


After adding Dzen2 to crontab(1) and keeping the earlier entries the complete crontab(1) would look like that.

% crontab -l
  *     *     * * * ~/scripts/                                       1> /dev/null 2> /dev/null
  */5   *     * * * ~/scripts/
  */20  *     * * * ~/scripts/ ~/gfx/wallpapers                       1> /dev/null 2> /dev/null
  12,0  *     * * * /usr/bin/find ~/.cache -mtime +10 -delete                            1> /dev/null 2> /dev/null
  0     */3   * * * /usr/bin/find ~/.local/share/Trash/files -mtime +1 -delete           1> /dev/null 2> /dev/null

  0     *     * * * ~/scripts/ 1> ~/.dzen2-fifo                                        2> /dev/null


This Dzen2 configuration implements five ‘mouse actions’ or shortcuts available on the status bar.

  • [Scroll Up] – switch next virtual desktop.
  • [Scroll Down] – switch previous virtual desktop.
  • [Right Click] – show Openbox root menu.
  • [Middle Click] – show Openbox window menu.
  • [Left Click] – update Dzen2 Status Bar with invoke.

Hope I haven’t forgot anything, feel free to ask or remind me ๐Ÿ˜‰


33 thoughts on “FreeBSD Desktop – Part 13 – Configuration – Dzen2

    1. vermaden Post author

      Yes, I need to ‘rework’ the other scripts to not need ‘root’ but if someone would only need network related things without rest as root then I added it for reference.


      1. vermaden Post author

        I would really like to see FreeBSD implementing an RBAC model from Solaris/Illumos for such cases … but I am afraid its not gonna happen ๐Ÿ™‚


  1. Pingback: FreeBSD Desktop – Part 14 – Configuration – Tint2 | vermaden

  2. Pingback: FreeBSD desktop (13) | 0ddn1x: tricks with *nix

  3. Pingback: FreeBSD Desktop – Part 12 – Configuration – Openbox | vermaden

  4. Pingback: FreeBSD Desktop – Part 11 – Key Components – Blue Light Spectrum Suppress | vermaden

  5. Pingback: FreeBSD Desktop – Part 10 – Key Components – Locking Solution | vermaden

  6. Pingback: FreeBSD Desktop – Part 9 – Key Components – Keyboard/Mouse Shortcuts | vermaden

  7. Pingback: FreeBSD Desktop – Part 7 – Key Components – Wallpaper Handling | vermaden

  8. Pingback: FreeBSD Desktop – Part 8 – Key Components – Application Launcher | vermaden

  9. Pingback: FreeBSD Desktop – Part 5 – Key Components – Status Bar | vermaden

  10. Pingback: FreeBSD Desktop – Part 4 – Key Components – Window Manager | vermaden

  11. Pingback: FreeBSD Desktop – Part 15 – Configuration – Fonts & Frameworks | vermaden

  12. Pingback: FreeBSD Desktop – Part 1 – Simplified Boot | vermaden

  13. Pingback: FreeBSD Desktop – Part 2 – Install | vermaden

  14. Pingback: FreeBSD Desktop – Part 3 – X11 Window System | vermaden

  15. Pingback: FreeBSD Desktop – Part 6 – Key Components – Task Bar | vermaden

  16. Pingback: FreeBSD Desktop – Part 16 – Configuration – Pause Any Application | vermaden

  17. Pingback: FreeBSD Desktop – Part 17 – Automount Removable Media | ๐Ÿ†…๐Ÿ…ด๐Ÿ†๐Ÿ„ผ๐Ÿ„ฐ๐Ÿ„ณ๐Ÿ…”๐Ÿ…

  18. Pingback: FreeBSD Desktop – Part 2.1 – Install FreeBSD 12 | ๐šŸ๐šŽ๐š›๐š–๐šŠ๐š๐šŽ๐š—

  19. Pingback: The Power to Serve – FreeBSD Power Management | ๐šŸ๐šŽ๐š›๐š–๐šŠ๐š๐šŽ๐š—

  20. Pingback: In Other BSDs for 2019/03/02 – DragonFly BSD Digest

  21. Pingback: Ghost in the Shell – Part 4 | ๐šŸ๐šŽ๐š›๐š–๐šŠ๐š๐šŽ๐š—

  22. Pingback: FreeBSD Desktop – Part 18 – Global Dashboard | ๐šŸ๐šŽ๐š›๐š–๐šŠ๐š๐šŽ๐š—

      1. vermaden Post author

        Yes, that is the problem of small resolution displays … as you also increased the font size that is the effect.

        You may also remove some of these information to get more space.

        Hope that helps.


  23. Kane

    It would seem I did not correctly follow the fonts and frameworks section, which was causing this issue.
    I apologize, itappears to be working OK now



Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s