Run ‘top’ Command Once and Exit – How to Guide

monitoringosxtop

I find the output of the shell command top to be a simple and familiar way to get a rough idea of the health of a machine. I'd like to serve top's output (or something very similar to it) from a tiny web server on a machine for crude monitoring purposes.

Is there a way to get top to write its textual output exactly once, without formatting characters? I've tried this:

(sleep 1; echo 'q') | top > output.txt

This seems to be close to what I want, except that (1) there's no guarantee that I won't get more or less than one screenful of info and (2) I have to strip out all the terminal formatting characters.

Or is there some other top-like command that lists both machine-wide and process-level memory/CPU usage/uptime info?

(Ideally, I'd love a strategy that's portable to both Linux and Mac OS X, since our devs use Macs and our prod environment is Linux.)

Best Answer

In Linux, you can try this:

top -bn1 > output.txt

From man top:

-b : Batch-mode operation
            Starts top in 'Batch' mode, which could be useful for sending
            output from top to other programs or  to  a  file.   In  this
            mode, top will not accept input and runs until the iterations
            limit you've set with the '-n' command-line option  or  until
            killed.
....
-n : Number-of-iterations limit as:  -n number
            Specifies  the  maximum  number of iterations, or frames, top
            should produce before ending.

With OS X, try:

top -l 1

From top OSX manpage:

 -l <samples>
              Use logging mode and display <samples> samples, even if 
              standard output is a terminal. 0 is treated  as  infinity.   
              Rather than redisplaying, output is periodically printed in 
              raw form. Note that the first sample displayed will have an 
              invalid %CPU displayed for each process,  as it is calculated 
              using the delta between samples.
Related Question