top shows what is running. bottom logs what starts and stops.
Start: 421: compiler --input main.go
Exec: 421: compiler --input main.go
Stop: 421: compiler --input main.go
Bottom only observes processes. It does not terminate, suspend, inject into, or otherwise alter them.
Install with Homebrew:
brew install donomii/tap/bottom-eventsInstall with Scoop:
scoop bucket add donomii https://github.com/donomii/scoop-bucket
scoop install bottom-events
Install from source with Go 1.25 or newer:
go install github.com/donomii/bottom@latestFrom a checkout:
./run.shRun bottom with no arguments for the readable process log:
bottomThe log goes to standard output, so ordinary shell redirection handles files:
bottom >process.log-backend NAME selects auto, poll, linux-proc-connector, windows-etw, or macos-endpoint-security. -poll DURATION changes the polling and fallback interval. -tui explicitly selects the interactive display instead of the readable log.
Run one command and log only it and its observed descendants:
bottom trace -- make testbottom trace -poll 10ms -tail 2s -- COMMAND controls descendant discovery and how long Bottom watches surviving descendants after the root command exits.
| Platform | Automatic source | Polling fallback |
|---|---|---|
| Linux | Process connector | /proc |
| macOS | Endpoint Security when the signed binary is entitled | Native process table |
| Windows | ETW | Tool Help process table |
| Other Unix | Process table polling | ps |
Native source failures are logged and automatically fall back to polling. Capture gaps are printed explicitly.
The macOS requirements and signing procedure are in docs/endpoint-security.md.
./build.sh
./test.sh
./benchmark.sh
./demo.sh
./install.shbuild.sh creates /Users/jer/mygit/bottom/bottom. run.sh starts the program without flags or configuration.
This is donomii/bottom, not the unrelated current-state system monitor at ClementTsang/bottom. Release packages use the bottom-events name while the installed command remains bottom.