This is the .xinitrc I was using recently (and might still be) dot_xinitrc:
DWM_DIR="$HOME/.dwm" DWM_LOG="$DWM_DIR/stdout.log" DWM_ERR="$DWM_DIR/stderr.log" DWM_FIFO="$DWM_DIR/display_status.fifo" STATUS_SCRIPT="$DWM_DIR/dwm_status.lua" ########################################################################### echo 'Saving old logfiles.' mv -f "$DWM_LOG" "$DWM_LOG.old.log" mv -f "$DWM_ERR" "$DWM_ERR.old.log" echo 'Resetting logfiles.' date >|"$DWM_LOG" date >|"$DWM_ERR" echo "Redirecting to logfiles:" echo ' stdout >> '$DWM_LOG echo ' stderr >> '$DWM_ERR exec >>"$DWM_LOG" 2>>"$DWM_ERR" ########################################################################### ## special handling for starts vs restarts # RESTART_FLAG="RESTART" if [ "$1" = "$RESTART_FLAG" ]; then echo "Restarting $0" else echo "Starting $0" # this is a clean start - do the things that should only be done once echo 'Setting desktop colour' # rgb:20/0/20 = a dark purple xsetroot -solid rgb:20/0/20 if [ -r ~/.Xresources ]; then echo 'Merging .XResources' xrdb -merge ~/.Xresources fi #if [ -r ~/.fonts/ ]; then # echo 'Adding ~/.fonts to font path' # xset fp+ ~/.fonts/ #fi if [ -r ~/.xmodmap ]; then echo 'Updating keyboard from .xmodmap' xmodmap ~/.xmodmap fi # don't start xautolock if this is 'L28' - it crashes on this machine [ "$HOST" = "L28" ] || if [ -x /usr/bin/xautolock ]; then echo 'Starting xautolock.' /usr/bin/xautolock & fi fi ########################################################################### echo 'Setting keyboard rate.' xset r rate 350 40 ########################################################################### echo 'Starting dwm_status.' [ -e "$DWM_FIFO" ] || mkfifo "$DWM_FIFO" [ -p "$DWM_FIFO" ] && lua "$STATUS_SCRIPT" >"$DWM_FIFO" & STATUS_SCRIPT_PID=$! ########################################################################### echo "Starting dwm." echo ============= #echo "Starting dwm with redirected outputs:" #echo " stdout > $DWM_LOG" #echo " stderr > $DWM_ERR" # Was previously using exec dwm, but that didn't allow for the restart stuff # It did have the advantage of closing the current shell & therefore saving memory #dwm <"$DWM_FIFO" >>"$DWM_LOG" 2>>"$DWM_ERR" dwm <"$DWM_FIFO" ########################################################################### echo 'Killing dwm_status.' kill $STATUS_SCRIPT_PID ########################################################################### echo 'Asking about restart.' # need to use /bin/echo to guarantee -e support (which is not a valid cmdline option in dash builtin echo) /bin/echo -en "y\nn" | dmenu -p "Restart DWM?" | grep -q 'y' && exec $0 $RESTART_FLAG echo "$0 terminating."
This is the dwm status script I was using recently (and might still be) dwm_status.lua:
#! /usr/bin/lua -- Description: Print load averages and suchlike for dwm status display function read_proc_stat() ------------------------------------------------- f=io.open('/proc/stat','r') s=f:read('*l') f:close() _, _, t_usr, t_nice, t_sys, t_idle = string.find(s, "^cpu%s+(%d+)%s+(%d+)%s+(%d+)%s+(%d+)") t_total = t_usr + t_nice + t_sys + t_idle -- only do calcs if we have successfully got some data to calc from if t_usr and t_nice and t_sys and t_idle and t_total_prev then t_step_jiffies = t_total - t_total_prev if t_step_jiffies<1 then t_step_jiffies = -1 end t_step = t_step_jiffies / 100 c_used = 1 - (t_idle - t_idle_prev) / t_step_jiffies else timestep = 100 t_step = 1 c_used = 0 end t_total_prev, t_idle_prev = t_total, t_idle -- find weighted rolling average if c_used_avg then c_used_avg = (c_used*2 + c_used_avg)/3 else c_used_avg = c_used end c_str = string.format("u%d", math.floor(c_used_avg*100+0.5)) return c_str, t_step end function read_proc_meminfo() ---------------------------------------------- f=io.open('/proc/meminfo','r') s=f:read('*all') f:close() -- get ram usage info _, _, m_total = string.find(s, "MemTotal:%s*(%d+)") _, _, m_free = string.find(s, "MemFree:%s*(%d+)") _, _, m_buffers = string.find(s, "Buffers:%s*(%d+)") _, _, m_cached = string.find(s, "Cached:%s*(%d+)") -- only do calcs if we have successfully got some data to calc from if m_total and m_free and m_buffers and m_cached then m_percent = math.floor((m_total-m_free-m_buffers-m_cached)/m_total * 100+0.5) -- don't display anything unless memory usage is high if m_percent>70 then m_str = string.format(" r%d", m_percent) else m_str = "" end else m_str = " r?" end -- get swap usage info _, _, s_total = string.find(s, "SwapTotal:%s*(%d+)") _, _, s_free = string.find(s, "SwapFree:%s*(%d+)") -- only do calcs if we have successfully got some data to calc from if s_total and s_free then s_percent = math.floor((s_total-s_free) / s_total * 100+0.5) -- don't display anything if swap usage is low if s_percent>1 then s_str = string.format(" s%d",s_percent) else s_str = "" end else s_str = " s?" end return m_str, s_str end function read_proc_net_dev(time_interval) ---------------------------------------------- f=io.open('/proc/net/dev','r') s=f:read('*all') f:close() -- Inter-| Receive | Transmit -- face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed -- lo: 4094 44 0 0 0 0 0 0 4094 44 0 0 0 0 0 0 -- eth0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 _, _, n_eth0_rxbytes, n_eth0_txbytes = string.find(s, "eth0:%s*(%d+)%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+(%d+)") _, _, n_ppp0_rxbytes, n_ppp0_txbytes = string.find(s, "ppp0:%s*(%d+)%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+(%d+)") -- only do calcs if we have successfully got some data to calc from if n_eth0_txbytes and n_eth0_rxbytes and n_eth0_rxbytes_prev then n_str=string.format(" n%d/%d", math.floor((n_eth0_rxbytes - n_eth0_rxbytes_prev) / time_interval*0.008+0.9), math.floor((n_eth0_txbytes - n_eth0_txbytes_prev) / time_interval*0.008+0.9) ) else n_str = ' n?/?' end -- only do calcs if we have successfully got some data to calc from if n_ppp0_txbytes and n_ppp0_rxbytes then if not n_ppp0_rxbytes_prev then n_ppp0_rx = 0 n_ppp0_tx = 0 p_str = ' p?/?' else --n_ppp0_rx = (n_ppp0_rxbytes - n_ppp0_rxbytes_prev) / time_interval --n_ppp0_tx = (n_ppp0_txbytes - n_ppp0_txbytes_prev) / time_interval p_str=string.format(" p%d/%d", math.floor((n_ppp0_rxbytes - n_ppp0_rxbytes_prev) / time_interval*0.008+0.9), math.floor((n_ppp0_txbytes - n_ppp0_txbytes_prev) / time_interval*0.008+0.9) ) end else p_str = nil n_ppp0_rx = nil n_ppp0_tx = nil end n_eth0_rxbytes_prev, n_eth0_txbytes_prev = n_eth0_rxbytes, n_eth0_txbytes n_ppp0_rxbytes_prev, n_ppp0_txbytes_prev = n_ppp0_rxbytes, n_ppp0_txbytes if p_str then return n_str..p_str else return n_str end end function read_proc_mounts() ----------------------------------------------- f=io.open('/proc/mounts','r') s=f:read('*all') f:close() mnt=' ' -- Old version which only showed things mounted on /media --for mountpoint in string.gmatch(s, "%S+%s+/media/(%S+)%s+") do -- mnt = mnt..' '..mountpoint --end -- Find all the mounted floppy/loop/scsi devices (and possibly some others). for device,mountpoint in string.gmatch(s, "/dev/([^h]%S+)%s+(/%S+)%s+") do mediamount = string.match(mountpoint, "^/media/(%S+)$") if mediamount then -- For anything mounted on /media, just show the last part of the mountpoint. -- These are normal mounts of things like flash drive, camera, etc. mnt = mnt..' '..mediamount elseif mountpoint ~= '/dev/.static/dev' then -- For anything mounted other than on /media, show the whole mountpoint. -- These are 'not-normal' mounts which I want to be notified of! -- Might need to do a test like the next line if undesired devices start slipping through: -- if string.match(device, "^s") or string.match(device, "^loop") then mnt = mnt..' '..mountpoint end end -- $ cat /proc/mounts -- rootfs / rootfs rw 0 0 -- none /sys sysfs rw 0 0 -- none /proc proc rw 0 0 -- udev /dev tmpfs rw 0 0 -- /dev/hda1 / ext3 rw,noatime,data=ordered 0 0 -- /dev/hda1 /dev/.static/dev ext3 rw,data=ordered 0 0 -- tmpfs /lib/init/rw tmpfs rw,nosuid 0 0 -- usbfs /proc/bus/usb usbfs rw,nosuid,nodev,noexec 0 0 -- tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0 -- devpts /dev/pts devpts rw,nosuid,noexec 0 0 -- /dev/hdc2 /home/karl/extra_space ext3 rw,nosuid,nodev,noexec,noatime,data=ordered 0 0 -- ckeys /home/karl/.ckeys tmpfs rw,nosuid,nodev,noexec,noatime 0 0 -- none /home/karl/mnt shfs rw 0 0 -- sshfs#karl@L73:/media/nuh7 /media/nuh7 fuse rw,nosuid,nodev,user_id=1000,group_id=1000,allow_other,max_read=65536 0 0 -- Find all the fuse and shfs mounts. --for device,mountpoint in string.gmatch(s, "(sshfs#%S+)%s+(/%S+)%s+") do --for device,mountpoint in string.gmatch(s, "(%S+[:#]%S+)%s+(/%S+)%s+") do for mountpoint,mounttype in string.gmatch(s, "%S+%s+(/%S+)%s+(%S+)%s") do if mounttype == 'fuse' then typechar = ' #' elseif mounttype == 'shfs' then typechar = ' $' else typechar = Nil end if typechar then mediamount = string.match(mountpoint, "^/media/(%S+)$") if mediamount then -- For anything mounted on /media, just show the last part of the mountpoint. -- These are normal mounts of things like flash drive, camera, etc. mnt = mnt..typechar..mediamount else -- For anything mounted other than on /media, show the whole mountpoint. -- These are 'not-normal' mounts which I want to be notified of! mnt = mnt..typechar..mountpoint end end end if mnt==' ' then return '' else return mnt end end --/\/--/\/--/\/--/\/--/\/--/\/--/\/--/\/--/\/--/\/--/\/--/\/--/\/--/\/--/\/ require("posix") while true do cpustr, timestep = read_proc_stat() netstr = read_proc_net_dev(timestep) memstr, swapstr = read_proc_meminfo() mntstr = read_proc_mounts() print( cpustr.. memstr.. swapstr.. netstr.. ' '..os.date("%d %a %k:%M")..mntstr ) io.flush() posix.sleep(1) end