A terminal UI for managing systemd services. Browse services, watch live logs, and control service lifecycle — all from one screen.
curl -fsSL https://rhizonymph.github.io/sysdui/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/sysdui.gpg
echo "deb [signed-by=/usr/share/keyrings/sysdui.gpg] https://rhizonymph.github.io/sysdui stable main" | sudo tee /etc/apt/sources.list.d/sysdui.list
sudo apt update
sudo apt install sysduiRequires Rust 1.85+ (edition 2024).
cargo install --path .sysduiRun as a normal user. When you perform an action on a system service (start, stop, etc.), sudo is invoked automatically — you'll see the password prompt in your terminal, then the TUI resumes. User services don't need elevation.
Logs are written to ~/.local/share/sysdui/sysdui.log. Set RUST_LOG=sysdui=debug for verbose output.
Press ? at any time to see the full list. All bindings are single lowercase keys — no shift combinations.
| Key | Action |
|---|---|
j / k / arrows |
Move up/down in service list |
Enter |
Select service (loads details + logs) |
PgUp / PgDn |
Scroll logs |
Tab |
Cycle focus between panes |
| Key | Action |
|---|---|
s |
Start |
r |
Restart |
x |
Stop |
n |
Enable |
d |
Disable |
o |
Daemon reload |
e |
Edit unit file in $EDITOR |
Each action shows a confirmation prompt. Press y to confirm or any other key to cancel.
| Key | Action |
|---|---|
/ |
Fuzzy search services by name |
Ctrl-/ |
Search within log output |
f |
Cycle scope filter: User / System / Both |
i |
Toggle include/all mode |
t |
Cycle sort: Name / Status / Enabled |
l |
Cycle log priority: err / warning / notice / info / debug |
Split the log area into multiple panes, each pinned to a different service — useful for watching related services side by side.
| Key | Action |
|---|---|
p |
Split focused pane (then h for horizontal, v for vertical) |
w |
Close focused pane |
Tab |
Cycle focus between panes |
| Action | Effect |
|---|---|
| Click service | Select it in sidebar |
| Double-click service | Select + load logs into focused pane |
| Right-click service | Context menu: Start / Stop / Restart / Enable / Disable / Split into pane |
| Click log pane | Focus that pane |
| Right-click log pane | Context menu: Split Horizontal / Vertical / Close |
| Middle-click log pane | Close pane |
| Scroll wheel over sidebar | Move selection up/down |
| Scroll wheel over log pane | Scroll that pane's logs (even if unfocused) |
| Click status bar | Cycle the clicked filter/sort (Scope / Status / Mode / Sort) |
| Key | Action |
|---|---|
q |
Quit |
? |
Show full keybinding help |
Esc |
Cancel / close overlay |
- Service list with color coding: green = active, red = failed, yellow = transitioning, gray = inactive. Failed services are always pinned to the top.
- Fuzzy search powered by nucleo — type a few characters of a service name to filter instantly.
- Live log tail streams
journalctloutput in real-time. Scroll up to freeze the view; a "new lines" counter appears so you don't lose your place. - Detail panel shows status, PID, memory usage, uptime, unit file path, enabled state, and dependencies — updated in real-time via D-Bus signals.
- Pane splitting lets you watch logs from multiple services simultaneously in a tmux-like layout.
- Privilege escalation is handled transparently — the TUI suspends, runs
sudo systemctl, and resumes.sudo's credential cache means you typically only authenticate once. - User + system services are shown together (filterable). User services use
systemctl --userand need no elevation.
Optional. Place a file at ~/.config/sysdui/config.toml:
[filter]
mode = "all" # "all" (show everything except excludes) or "include" (only show includes)
show = "both" # "user", "system", or "both"
include = ["nginx.service", "sshd.service"]
exclude = ["systemd-tmpfiles-clean.service"]
[sort]
default = "name" # "name", "status", or "enabled"
[log]
priority = "info" # "err", "warning", "notice", "info", "debug"
[confirmations]
global = true # set to false to skip all confirmation prompts
start = true
stop = true
restart = true
enable = true
disable = true
daemon_reload = true
[keys]
# Remap any binding. Value is a key combo string.
# Examples: "s", "ctrl-s", "f1", "enter"
start = "s"
stop = "x"
quit = "q"
# ... see source for all key names- Linux with systemd
- D-Bus (system and session bus)
journalctlin$PATHsudofor system service actions
