31

How do I get top to quit similarly to the way less quits, that is, not leaving behind its output on the screen?

This is the version I have:

procps-ng version 3.3.9
1
  • How about using an alternative, like htop?
    – user319727
    Mar 9, 2018 at 3:48

5 Answers 5

50

When you start it like this ...

top && clear

... the screen clears after exiting top with q.

This acts more like less:

tput smcup ; top ; tput rmcup

(smcup switches to a secondary screen where the top command is executed and when you quit top rmcup switches back to the normal screen)


You could alias the top command to do that ( How do I create a permanent Bash alias? )

5
  • 3
    clear seems to erase all but the last screen of the scrollback buffer too (so just leaving top's last screen in this case) - at least in xfce4-terminal and QTerminal. The tput answer works great, especially in an alias for top
    – Xen2050
    Mar 8, 2018 at 10:41
  • 2
    Don't forget Ctl+L for a quick-fix.
    – jpaugh
    Mar 8, 2018 at 14:41
  • Oh, interesting; I was wondering why less's last output completely disappeared from the buffer. Mar 8, 2018 at 15:04
  • Some other suggestions: 1. use the far-superior-but-not-built-in htop, and 2. alias the commands together so you don't have to manually chain them each time.
    – flith
    Mar 9, 2018 at 6:49
  • @flith I am not going to steal the other users answers ;-)
    – Rinzwind
    Mar 9, 2018 at 8:04
31

Ironically1, this was briefly the behaviour of top. In 3.3.8, top did clear the screen, but not in versions past or since. See Red Hat bug #977561:

The screen clearing is an indirect result of changes in terminal manipulations which were introduced by Jim Warner (author of the 'top' tool) in order to suppress flooding the 'top' tool with SIGWINCH signals generated by some of the widely used terminal applications. It was me who reported the flooding issue and he tried to do his best in order to resolve it and released a fix for the issue in form of 8 separate commits. The commit introducing the screen clearing has the following hash : 'dedaf6e1a81738ff08ee8e8523871e12f555ad6d'.

Due to the bug report, Jim then fixed it to again not clear the output in 3.3.9.

top has no options or configuration settings to control this, AFAICT, this is entirely hardcoded behaviour. You might want to file a feature request at https://gitlab.com/procps-ng/procps/issues/.

Until then, you could clear manually like Rinzwind suggested, or use tput like steeldriver suggests.


Interestingly, the commit mentioned above also has a nice explanation of the command steeldriver suggested, because it is in fact the same as what was originally done in the code:

A scrollback buffer used in several terminal emulators could be a real inconvenience to a user following some resize operations. Extra keystroke(s) would frequently be required in order to properly render top's display.

After much sleuthing we unearthed two terminfo strings which have the effect of disabling/restoring that darn scrollback buffer. They were well hidden under a title of strings 'to start/end programs using cup'. In turn, 'cup' deals with a tty's cursor addressing capability.

We don't care what you call them or what they refer to so long as they get the job done. And these really do! Be advised, however, that there are some side effects, several of which can even be considered as beneficial:

  • enter_ca_mode/smcup/ti disables scrollback buffering ( and that's good, it's what we had always hoped for )

  • exit_ca_mode/rmcup/te restores the scrollback buffer ( but also restores screen contents existing pre-top ) ( which is different from former program end results ) ( where that last rendered screen was left untouched )

... which corresponds to the tput smcup and tput rmcup commands.


1 Obligatory xkcd.

1
  • Interestingly BSD top (e.g. on MacOS) also does clear the terminal Mar 9, 2018 at 22:49
15

The behavior you are looking for from less is built in to an alternative called htop. You can install it with:

sudo apt-get install htop

Specifically, it switching to the alternate screen mode before starting preserving your original screen contents when you close htop. It also has a variety of other enhancements over procps's top. Once it's installed, you can just run it as a regular user:

htop
1
  • Plus htop is very colourful, adds mouse support, etc. Mar 11, 2018 at 16:14
4

You could use watch:

watch top -b

It default to update every two seconds, use e.g. -n1 for one second if you want to change this behaviour. To quit watch, press Ctrl+C instead of the usual Q.

Another approach is opening a new terminal window, e.g. with xterm:

xterm -e top

This behaves exactly like top normally does, the window closes when you quit top with Q and of course it leaves no output in the terminal you started it from. Add & to the end of this command to start it in the background and immediately release the terminal again.

1

As Rinzwind's answer points out, the clear command clears top output from the screen.

After exiting top you can also use Ctrl+L to clear the top output from the screen. After either command though, you can still scroll up the screen to see the old top output.

To really clear the screen, such that the top output cannot be scrolled back to, use the reset command:

top && reset

Another option to give that "fresh look" of a brand new session is by running an "ASCII splash screen" (if you have one). In my case I would run:

top && reset && now && screenfetch

reset now splash.png

  • My now script calls weather, calendar (cal) and toilet with fancy time.
  • screenfetch paints the Ubuntu logo and machine stats.
10
  • 1
    I wouldn't recommend re-running .bashrc regularly without need because usually there are lines like export PATH=...:$PATH in that file and running it multiple times will unnecessarily extend the PATH. Also, calling neofetch in .bashrc is not standard behaviour (although it looks fancy). For instance, when I re-run my .bashrc nothing apparent happens.
    – PerlDuck
    Mar 10, 2018 at 18:21
  • CTRL+L and clear behave not the same: try for i in {1..200}; do echo "line $i"; done in two different, fresh windows. Then hit CTRL+L in window1 and type clear in window2. Now scroll back in both windows (mouse wheel). In the CTRL+L-window you can see all lines (depending on your scroll buffer) while in the clear-window you can only scroll back one screen. That is: clear clears the scrollback buffer while CTRL+L is similar to $window_height times pressing ENTER (aka newline).
    – PerlDuck
    Mar 10, 2018 at 18:46
  • 1
    @PerlDuck neofetch is a good catch but it's a derivative I guess called screenfetch. I use it to remind myself I'm in Ubuntu because I have dual boot and Windows Bash has a different splash screen. I'll take out .bashrc reference. As for clear and Ctrl+L my point was they are similar in that they both leave top output in scroll back buffer. Mar 10, 2018 at 23:13
  • 2
    I think everybody has different things in their .bashrc. Try curl wttr.in/Edmonton?0, it's awesome. Use curl wttr.in/:help to get help. I have a similar call in a /etc/update-motd.d/ scriptlet so I get informed when logging in from console or ssh (not for every terminal window). If you like that, add --silent --max-time 3 to the curl call so it won't take forever if internet is slow.
    – PerlDuck
    Mar 11, 2018 at 11:43
  • @PerlDuck The curl wttr.in/Edmonton?0 is AWESOME! Thank you so much. I'll try to squeeze that in after the toilet time display on my splash screen :) Mar 11, 2018 at 16:13

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .