tuxctl v0.3.0
v0.3.0 adds ways to track and filter what you are looking at: pin processes, filter views, change the sampling interval while tuxctl runs, and see disk I/O and RAM/network trends on Overview. It also fixes a security issue: text from other users could send escape sequences to your terminal. Upgrading is recommended.
Security
- Terminal escape injection (all earlier versions). Process names, command lines, journal messages and other system data were written to the terminal unfiltered. Any local user could embed escape sequences in them, for example with
loggeror by renaming a process. When you opened the Processes or Logs screen, they could replace your clipboard (OSC 52, which kitty, alacritty, foot and wezterm allow by default) or reset the terminal. tuxctl now removes control characters and bidirectional overrides from everything it draws; affected characters show as�. Upgrade especially if you run tuxctl as root or on a shared machine. - Processes whose name is not valid UTF-8 are now listed and can be signaled; before, any user could hide a process from tuxctl this way.
New
- Pin processes.
Ppins the selected process to the top of the Processes list (up to 8).Shift+↑/Shift+↓(orAlt), or the▲/▼controls, reorder them. Sorting applies below the pins. Pins follow the process identity, so a reused PID never inherits one. A pinned process that exits shows asexitedfor a few seconds and can never be signaled. Pinned processes are also listed with their CPU and memory on the Overview System panel. - View filters (
v). Processes: hide kernel threads. Services: all units, loaded units only, or failed units only. Logs: minimum priority notice, warning or error. Filters combine with search and stay visible in the status line. - Sampling interval at runtime.
+/-, or clicking[-]/[+]in the top-right corner, step through the--intervalpresets (250ms to 60s) without restarting. - Disk I/O. Overview storage rows show read and write throughput for each disk.
- Trends. Overview shows RAM usage and network traffic sparklines next to the CPU history.
- Main menu.
Esc, when there is nothing to close or clear, opens a menu with About and Exit.
Changed
Escwith nothing left to close now opens the main menu instead of doing nothing. The menu starts on About, so an extraEnterdoes not quit.- The Help overlay lists every binding and no longer cuts off its last line.
Fixes
- While typing a search,
↑/↓andPageUp/PageDownnow move through the matches; before,Enteropened whichever row happened to be selected.
Under the hood
- Collectors take their sampling period from their shared control primitive, so it can change while they run; rates use the actual time between samples.
- CI also measures at the 250ms interval, and the idle redraw limit follows the interval. The smoke test covers the menu and the interval keys.
Measured with the release binary on an AMD Ryzen 5 7500F at the default interval: 0.6% CPU when idle on Overview, 13.5 redraws per second under 240 Hz mouse hover, and about 2.3 MiB of RSS after 15 minutes, with no growth after warm-up. Measured alternately with v0.2.7 on the same machine (3 runs each), every difference is within run-to-run noise. The binary is about 4% larger.
Verification
- 401 unit tests and 4 command-line integration tests passing (glibc and musl)
cargo fmt --checkPASScargo checkPASScargo clippy --all-targets --all-features -- -D warningsPASScargo testPASScargo build --releasePASSscripts/smoke.py37/37 on the glibc and musl release builds- CI green, including MSRV 1.88 and the redraw guards at the default and 250ms intervals
Minimum supported terminal size: 40×15. Minimum supported Rust version: 1.88.
Installation
Linux only
Prebuilt binary (x86_64 or aarch64):
arch=$(uname -m)
base=https://github.com/Seqat/tuxctl/releases/download/v0.3.0
curl -LO "$base/tuxctl-$arch-unknown-linux-musl.tar.gz" -LO "$base/SHA256SUMS"
sha256sum -c --ignore-missing SHA256SUMS
tar xzf "tuxctl-$arch-unknown-linux-musl.tar.gz"
install -Dm755 "tuxctl-$arch-unknown-linux-musl/tuxctl" ~/.local/bin/tuxctlFrom source:
cargo install --git https://github.com/Seqat/tuxctl --tag v0.3.0 --lockedThen run:
tuxctl
tuxctl --interval 2s