1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
# bottom
[![Build Status](https://travis-ci.com/ClementTsang/bottom.svg?token=1wvzVgp94E1TZyPNs8JF&branch=master)](https://travis-ci.com/ClementTsang/bottom) [![crates.io link](https://img.shields.io/crates/v/bottom.svg)](https://crates.io/crates/bottom)
A graphical top clone, written in Rust. Inspired by both [gtop](https://github.com/aksakalli/gtop) and [gotop](https://github.com/cjbassi/gotop).
![Quick demo recording](assets/recording_1.gif) _Terminal: Kitty Terminal, Font: IBM Plex Mono, OS: Arch Linux_
## Features
Features of bottom include:
- CPU widget to show a visual representation of per-core usage. Average CPU display also exists.
- Memory widget to show a visual representation of both RAM and SWAP usage.
- Networks widget to show a log-based visual representation of network usage.
- Sortable and searchable process widget. Searching supports regex, and you can search by PID and process name.
- Disks widget to display usage and I/O per second.
- Temperature widget to monitor detected sensors in your system.
- Config file support for custom colours and default options.
- Maximizing of widgets of interest.
Details about each widget can be found [here](./docs/widgets.md).
The compatibility of each widget and operating systems are, as of version 0.1.0, as follows:
| OS | CPU | Memory | Disks | Temperature | Processes | Networks |
| -------------------------------- | --- | ------ | ----- | ----------- | --------- | -------- |
| Linux (tested on Arch Linux) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Windows (tested on Windows 10) | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| macOS (tested on macOS Catalina) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
## Installation
In all cases you can install the in-development version by cloning and using `cargo build --release`. Note this is built and tested with Rust Stable (1.41.0 as of writing). You can also get release versions using `cargo install bottom`, or manually building from the [Releases](https://github.com/ClementTsang/bottom/releases) page by downloading and building.
### Linux
Other installation methods based on distros are as follows:
#### Arch Linux
You can get the release versions from the AUR by installing `bottom`.
#### Ubuntu
TBD
### Windows
I advise running the program with the `--dot_marker` or `-m` option, as the braille font seems to not work out of the box on Powershell. You may need to install a font like [FreeMono](https://fonts2u.com/free-monospaced.font) and use a terminal like cmder for font support to work properly, unfortunately.
I plan to add a Chocolatey install option in the future.
### macOS
macOS seems to work fine for the most part, barring minor issues with the `Ctrl`-arrow key bindings (use `Shift` instead). I plan to add a Homebrew install option in the future.
## Usage
Run using `btm`.
### Command line options
- `-h`, `--help` shows the help screen and exits.
- `-a`, `--avg_cpu` enables also showing the average CPU usage in addition to per-core CPU usage.
- `-m`, `--dot-marker` uses a dot marker instead of the default braille marker.
- Temperature units (you can only use one at a time):
- `-c`, `--celsius` displays the temperature type in Celsius. This is the default.
- `-f`, `--fahrenheit` displays the temperature type in Fahrenheit.
- `-k`, `--kelvin` displays the temperature type in Kelvin.
- `-v`, `--version` displays the version number and exits.
- `-r <RATE>`, `--rate <RATE>` will set the refresh rate in _milliseconds_. Lowest it can go is 250ms, the highest it can go is 2<sup>128</sup> - 1. Defaults to 1000ms, and lower values may take more resources due to more frequent polling of data, and may be less accurate in some circumstances.
- `-l`, `--left_legend` will move external table legends to the left side rather than the right side. Right side is default.
- `-u`, `--current_usage` will make a process' CPU usage be based on the current total CPU usage, rather than assuming 100% CPU usage.
- `-g`, `--group` will group together processes with the same name by default (equivalent to pressing `Tab`).
- `-S`, `--case_sensitive` will default to matching case.
- `-W`, `--whole` will default to searching for the world word.
- `-R`, `--regex` will default to using regex.
- `--cpu_default`, `--memory_default`, `--disk_default`, `--temperature_default`, `--network_default`, `--process_default` will select the corresponding widget on startup. By default the process widget is selected.
- `-C`, `--config` takes in a file path leading to a TOML file.
### Config Files
The ability to use config files is supported by bottom to set boot flags by default, and set colour options. See [this document](./docs/config.md) for more details.
See this [config](./sample_config.toml) for an example.
### Keybindings
#### General
- `q`, `Ctrl-c` to quit. Note if you are currently in the search widget, `q` will not work so you can still type.
- `Ctrl-r` to reset the screen and reset all collected data.
- `f` to freeze the screen from updating with new data. Press `f` again to unfreeze. Note that monitoring will still continue in the background.
- `Ctrl/Shift`-arrow or `H/J/K/L` to navigate between widgets. **Note that on macOS, `Ctrl`-arrow keys seem to conflict with an existing macOS binding, use `Shift`-arrow key or `H/J/K/L` instead.**
- `Esc` to close a dialog window or exit maximized mode.
- `?` to get a help screen explaining the controls. Note all controls except `Esc` to close the dialog will be disabled while this is open.
- `Enter` on a widget to maximize the widget.
#### Scrollable Tables
- `Up` or `k` and `Down` or `j` scrolls through the list if the widget is a table (Temperature, Disks, Processes).
- `gg` or `Home` to jump to the first entry of the current table.
- `G` (`Shift-g`) or `End` to jump to the last entry of the current table.
#### Processes
- `dd` to kill the selected process
- `c` to sort by CPU usage. Sorts in descending order by default. Press again to reverse sorting order.
- `m` to sort by memory usage. Sorts in descending order by default. Press again to reverse sorting order.
- `p` to sort by PID. Sorts in ascending order by default. Press again to reverse sorting order.
- `n` to sort by process name. Sorts in ascending order by default. Press again to reverse sorting order.
- `Tab` to group together processes with the same name. Disables PID sorting. `dd` will now kill all processes covered by that name.
- `Ctrl-f` or `/` to open the search widget.
#### Search Widget
- `Tab` to switch between searching for PID and name respectively.
- `Alt-c` to toggle ignoring case.
- `Alt-m` to toggle matching the entire word.
- `Alt-r` to toggle using regex.
- `Ctrl-a` and `Ctrl-e` to jump to the start and end of the search bar respectively.
- `Esc` to close.
- `Left` and `Right` arrow keys to move the cursor within the search bar.
Note that `q` is disabled while in the search widget.
### Mouse actions
- Scrolling with the mouse will scroll through the currently selected list if the widget is a scrollable table.
## Thanks, kudos, and all the like
- This project is very much inspired by both [gotop](https://github.com/cjbassi/gotop) and [gtop](https://github.com/aksakalli/gtop).
- This application was written with the following libraries:
- [backtrace](https://github.com/rust-lang/backtrace-rs)
- [chrono](https://github.com/chronotope/chrono)
- [clap](https://github.com/clap-rs/clap)
- [crossterm](https://github.com/TimonPost/crossterm)
- [fern](https://github.com/daboross/fern)
- [futures-rs](https://github.com/rust-lang-nursery/futures-rs)
- [futures-timer](https://github.com/rustasync/futures-timer)
- [heim](https://github.com/heim-rs/heim)
- [lazy_static](https://github.com/rust-lang-nursery/lazy-static.rs)
- [log](https://github.com/rust-lang-nursery/log)
- [sysinfo](https://github.com/GuillaumeGomez/sysinfo)
- [tokio](https://github.com/tokio-rs/tokio)
- [toml-rs](https://github.com/alexcrichton/toml-rs)
- [tui-rs](https://github.com/fdehau/tui-rs)
- [winapi](https://github.com/retep998/winapi-rs)
|