Having done Linux administration for over 10 years now, I use the watch command almost every day. On Linux, watch will run a command every couple seconds. It’s particularly nice for watching files change:

# watch ls -lah

This example will keep showing the output of ls -lah every 2 seconds.

About a year ago I switched a couple servers over to FreeBSD 6.1 because of it’s security features and more stable development model. For the last year I’ve been occasionally using the watch command on FreeBSD and getting an annoying error like this:

[root@devel /backup]# watch ls -lah
watch: fatal: bad device name

Today it finally occured to me to look at the manpage:

WATCH(8)                FreeBSD System Manager's Manual               WATCH(8)

NAME
watch -- snoop on another tty line

SYNOPSIS
watch  -cinotW -f snpdev tty

DESCRIPTION
The watch utility allows the user to examine all data coming through a
specified tty using the snp(4) device.  If the snp(4) device is not
available, watch will attempt to load the module (snp).  The watch utility writes to standard output.

It hardly looks like the watch I know! It turns out that FreeBSD has a different use for watch – snooping on other consoles. On FreeBSD, the GNU watch (like on Linux) is called gnu-watch. If you don’t want to install it, you can easily whip up a poor-man’s replacement:

#!/usr/local/bin/bash
while [ 1 -lt 2 ]
do
clear
date
echo ------------------------------------
eval $@
sleep 2
done

TIP: To replace the default ‘watch’ with this script, save the above script as /root/watch, then make it executable, chmod +x /root/watch and alias it in your shell, alias watch=’/root/watch’. You can save this alias permenantly with the bash shell by adding it to ~/.bash_profile .

Here’s a sample output from the poor-man’s watch:

Thu Jul 10 22:09:27 EDT 2008
------------------------------------
total 17113832
drwxr-xr-x   3 root  wheel   512B Jul 10 21:03 .
drwxr-xr-x  21 root  wheel   512B Jul 10 18:25 ..
-rw-r--r--   1 root  wheel    97M Jul 10 15:41 archive1.tar
-rw-r--r--   1 root  wheel    40M Jul 10 15:41 archive1.tar.bz2
-rw-r--r--   1 root  wheel   308M Jul 10 17:19 archive2.tar
-rw-r--r--   1 root  wheel    93M Jul 10 17:19 archive2.tar.bz2
-rw-r--r--   1 root  wheel   600M Jul 10 17:13 archive2a.tar
-rw-r--r--   1 root  wheel   192M Jul 10 17:13 archive2a.tar.bz2
-rw-r--r--   1 root  wheel   3.3G Jul 10 19:09 archive2b.tar
-rw-r--r--   1 root  wheel   1.4G Jul 10 19:09 archive2b.tar.bz2
-rw-r--r--   1 root  wheel   5.4G Jul 10 19:33 archive2c.tar
-rw-------   1 root  wheel   1.9G Jul 10 22:09 archive2c.tar.bz2
-rw-r--r--   1 root  wheel   2.1G Jul 10 17:44 archive2d.tar
-rw-r--r--   1 root  wheel   886M Jul 10 16:08 archive3.tar
drwxr-xr-x   2 root  wheel   512B Jul 10 19:44 scripts