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.)
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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.
Method 2
To get similar type numbers from a Windows system you will want to take a look at powershell.
Just to get a list of processes you and look at get-process. Take a look at this reference.
In doing some further searches, found a nice little command here.
Which if you take out of the while loop presented, for your needs would be:
ps | sort -desc cpu | select -first 30
ps in powershell is an alias for get-process.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0