watch
is one of those Unix tools which does something very simple, but
combined with other tools has a myriad of uses. While there are a few useful
features or switches for watch
, its central concept is simple; it runs
something for you repeatedly, and shows the output on the screen.
The reason this becomes so useful in a system administration context is that
when used with a terminal multiplexer, watch
can be used to track the
progress of any particular task, or to monitor system resources, as you work
and change things. Some examples of simple but useful monitoring tasks are:
- Load average —
watch uptime
- Disk space —
watch df -h
- Process count —
watch 'ps -ef | wc -l'
- Memory usage —
watch free -m
- Size of a volatile file —
watch du -sh filename.sh
Of course, it’s not a terribly good use of an administrator or developer’s time
to just sit there and watch these change, particularly if you want to make
changes to the system or application and see how they affect the results of
your monitoring. This is where a terminal multiplexer like tmux comes in
handy, for putting instances of watch
and other more complex monitoring tools
like htop
or tload
into independent panes of a terminal window so
you can work as you watch
them.
You can set these windows up using the usual key combinations, but if you have
a long string of text or a known command that you want to start running in
another window, it’s often easier to call the relevant tmux
commands directly
from the shell:
$ watch uptime
$ tmux split-window -dh "!!"
This will split the window into two parts, and run watch uptime
in the new
one, while leaving your cursor in the original window.
If you find yourself doing this often, you could make it into a shell function
in your .bashrc
or similar:
function tmw {
tmux split-window -dh "$*"
}
You can then quickly run things like the following, as a kind of general method to background a monitoring or long-running task quickly:
$ tmw watch uptime
$ tmw htop
$ tmw rsync -arvz source::mnt/location /home/tom/destination
Thanks to user WishCow for pointing out an error in the comments.