Usage¶
A bare sinteractive launches; everything else is a subcommand
(sinteractive --help, sinteractive <command> --help, man sinteractive).
Commands¶
Sessions¶
| Command | What it does |
|---|---|
launch |
Launch a new session (the default when no subcommand is given) |
attach [TARGET] [--ssh] |
Reattach to a session by JOBID or NAME (your only session when omitted) |
list |
List running sessions |
status [TARGET] [--refresh] |
Show one session's status; --refresh re-checks its time budget against Slurm first |
cancel TARGET |
Cancel a session |
Watching¶
| Command | What it does |
|---|---|
queue [--all] [--watch] |
Your job queue: running, pending (with reasons), and recent history |
monitor [TARGET\|HOST] [--live] [--once] |
Live CPU/GPU/process view of a session's node, or any host; --once prints one sample of this host and exits |
quota [--check] |
Storage quota (Bodhi daemons) |
doctor [--nodes] |
Check this install and, optionally, every compute node |
Driving a session from outside¶
A person at a prompt attaches; a script or an agent reaches in with these.
| Command | What it does |
|---|---|
session ensure NAME |
Reuse the session named NAME, or launch it if absent (implies --detach) |
session peek TARGET [-n LINES] |
Read the last lines of a session's screen |
session send TARGET COMMAND |
Type a command into a session's shell |
session events [TARGET] [--follow] [--since EPOCH] |
Stream session events (NDJSON) |
Claude Code¶
| Command | What it does |
|---|---|
claude install |
Install the Claude Code skills, hooks, statusline and MCP server |
claude context |
Brief a coding agent on the session it is running inside |
claude hook session-start\|prompt\|worktree-create\|worktree-remove\|agent-guard |
Hook entry points (Claude Code runs these) |
claude statusline |
statusLine command (Claude Code runs this) |
claude mcp |
MCP server over stdio (Claude Code runs this) |
claude install writes the last four into your Claude Code settings; you
never type them yourself.
Generated output¶
| Command | What it does |
|---|---|
gen completions SHELL |
Shell completions (bash, zsh, fish, …) |
gen man |
The man page (roff) |
gen schema |
The JSON schemas of the machine-readable outputs |
zellij ... |
The embedded zellij's own command line |
status, list, cancel, queue, monitor, quota, doctor and
launch --detach take --json. TARGET is a JOBID or a session NAME;
inside a session it defaults to the current one.
The pre-grouping spellings — ensure, peek, send, events, refresh,
snapshot, agent-context, hook, statusline, mcp, install-claude,
completions, man and schema as top-level commands — still work but are
hidden from --help.
Launch options¶
| Option | Description | Default |
|---|---|---|
--node NODE |
Request a specific compute node (--nodelist) |
any available |
-p, --partition PART |
Slurm partition | interactive |
-t, --time TIME |
Wall time (8h, 30m, 1d12h, or Slurm D-HH:MM:SS) |
24:00:00 |
-j, --threads N |
Number of CPUs (--cpus-per-task) |
2 |
-m, --mem SIZE |
Memory (--mem) |
8G |
-n, --name NAME |
Tag the session with a name for easy reattach (attach NAME) |
|
--mouse |
Enable mouse support in the session | on |
--no-mouse |
Disable mouse support (overrides SINTERACTIVE_MOUSE) |
|
--detach |
Launch without attaching; print connection info and return | |
--json |
Machine-readable JSON output (with --detach) |
All other arguments are passed directly to sbatch, in any order, so you can
use any sbatch option (--gres=gpu:1, --qos=long, --account=...).
session ensure takes the same options after the name.
Examples¶
# Default: 1-day session, 2 CPUs, 8G memory
sinteractive
# Named, 8 hours, 4 CPUs, 16G
sinteractive -n rna-seq -t 8h -j 4 -m 16G
# Run on a specific node
sinteractive --node compute01
# GPU session; unknown flags go to sbatch
sinteractive --partition=gpu --gres=gpu:1 --mem=16G
# Longer session on the normal partition (Bodhi: up to 3 days)
sinteractive --time=1-12:00:00 --partition=normal
# Launch without attaching, then come back to it
sinteractive --detach -n build
sinteractive attach build
# What is running, and how long is left?
sinteractive list
sinteractive status build
# The queue, refreshed every 5 s (q to exit)
sinteractive queue --watch
# The build session's node, nvitop-style, from the login node
sinteractive monitor build
# Read the last 40 lines of a session's screen
sinteractive session peek build -n 40
Inside a session¶
Ctrl+b is the only chord (tmux muscle memory); press it, then one key.
Everything else zellij binds by default is cleared, so shell and editor keys
pass through untouched. Ctrl+b h shows the same legend in the status bar.
| Keys | Action |
|---|---|
Ctrl+b d |
Detach — the session keeps running |
Ctrl+b h (or ?) |
Key legend in the bar; again for the next page, Esc to close |
Ctrl+b n |
Read the notices (quota, trimmed end time, hints) one at a time; Ctrl+b n again for the next, Ctrl+b Esc closes |
Ctrl+b m |
Focus the monitor panel (CPU, memory and GPU bars), opening it if it is closed; again to hand the focus back to the shell |
Ctrl+b , / Ctrl+b . |
Previous / next job in the monitor panel, without focusing it |
Ctrl+b q |
Your queue in a floating pane (sinteractive queue --watch) — running, pending and the last 24 h; q or Esc closes it, r refreshes (the pane says so on its second line) |
Ctrl+b c |
New pane |
Ctrl+b " / Ctrl+b % |
Split down / split right |
Ctrl+b x |
Close the focused pane |
Ctrl+b z |
Zoom the focused pane |
Ctrl+b o, Ctrl+b ←↑→↓ |
Focus the next pane / a direction |
Ctrl+b [ |
Scroll mode: j/k or arrows, PgUp/PgDn, d/u half pages, g/G, / search (n/p next/previous), e open the scrollback in $EDITOR, q/Esc to leave |
Ctrl+b r |
Resize mode: arrows or hjkl grow, HJKL shrink, +/-, Enter/Esc to leave |
Ctrl+b : |
zellij's pane mode (n/d/r new panes, f fullscreen, w floating, c rename pane) |
Ctrl+b Ctrl+b |
Send a literal Ctrl+b |
The status bar¶
- The dot spins while the session is starting, and turns yellow, then red,
as the walltime runs down (
SINTERACTIVE_WARN_YELLOW/_RED: an hour and ten minutes by default).SINTERACTIVE_GRACEseconds before the limit the session ends itself, so teardown runs cleanly instead of under Slurm's SIGKILL. 3R launchedcounts the running (R) and pending (PD) jobs started from this session — not every job you own, which the session cannot do anything about. Slurm records the node a job was submitted from and the session id of the process that submitted it, so a job is a candidate when it was submitted on this node and that process is either gone or names this session. A running job then has the last word itself: Slurm gives a job the environment of the shell that submitted it, and a session exportsSINTERACTIVE_JOB_IDinto every shell it runs, so the job's own processes say which session started it, however long ago that shell exited. A job that a previous session on this node started is dropped on its first sample; a pending job has no processes yet and stays on Slurm's word. Absent when nothing has been launched, which is most of the time.▣ N jobs monitorable ^b mappears when there is a host the monitor panel could show and the panel is closed. The panel shows the same jobs the count counts — the ones launched from this session.⚠ N notices ^b nappears when the session has something to say — a quota overage (red, shimmering), a walltime trimmed before a maintenance window, a hint to runclaude installwhile Claude Code is running without the hooks. Absent when there is nothing to say;sinteractive statusprints the same text from the login node.
Segments drop from the right as the terminal narrows; the job id is the last to go.
The monitor panel¶
Ctrl+b m opens a six-row panel between the shell and the bar: a strip of
every running job launched from this session (this one first), then bars
for CPU and memory against the selected job's cgroup limits, and a row per
GPU. A job with no GPU spends the spare row on where its load has been, a
sparkline the width of the bars above it.
Jobs on other nodes are sampled over ssh every ten seconds; one on this
node is sampled here.
In a pane 122 columns or wider the resources go two to a row — cpu
beside mem, then the GPUs in pairs — so a four-GPU node fits with a row
to spare. Narrower than that the rows stack as below, and a third and
fourth GPU fall off the bottom.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
147845 mywork · 246422 sint-mods 1/2 ←→ job · t top · esc shell · x close
cpu ███████░░░░░░░░░░░░░ 34% of 8 · load 3.2
mem ███████░░░░░░░░░░░░░ 37% 12.0G / 32G
gpu0 █████████████████░░░ 87% 31/40G 61°C 240W ████░░░░
Ctrl+b m focuses the panel rather than toggling it, so the panel is a
pane you step into and out of:
| In the focused panel | |
|---|---|
← / → (or h / l) |
Previous / next job |
t (or Enter) |
The full sinteractive monitor TUI for the selected job, in a floating pane — the process table, sorted and scrollable. q closes it |
Esc / q |
Back to the shell; the panel stays open |
x (or Ctrl+b x) |
Close the panel |
Ctrl+b chords keep working while the panel holds the focus — zellij reads
the prefix before the focused pane sees a key — so Ctrl+b m steps back out
to the shell, Ctrl+b d detaches, and so on. From the shell, Ctrl+b , and
Ctrl+b . step through jobs without taking the focus at all.
Mouse, copy and paste¶
Mouse mode is on by default: scroll with the wheel, click to focus a pane,
drag borders to resize, and select text to copy it — the selection lands in
your local system clipboard over SSH via OSC 52. Hold Shift to select
with the terminal instead. --no-mouse or SINTERACTIVE_MOUSE=off turns
mouse mode off for a session.
For keyboard copying, Ctrl+b [ enters scroll mode; e opens the whole
scrollback in $EDITOR, which is the easiest way to search or copy a long
stretch of output.
Reconnecting after a disconnect¶
If your SSH connection drops or you detach (Ctrl+b d), the session
keeps running on the compute node and your work is safe. From the login
node:
# List your running sessions
sinteractive list
# JOBID NAME NODE PARTITION ELAPSED TIMELIMIT CWD
# 12345 rna-seq compute01 cpu 01:23:45 1-00:00:00 ~/projects/rna-seq
# Reattach
sinteractive attach 12345
sinteractive attach rna-seq
If you have only one session running, a bare sinteractive attach goes
straight to it — no need to look up the job id first. With several running,
it lists them with ready-to-run commands to pick from.
attach reconnects through Slurm (srun --overlap), which needs no SSH
access to the node. attach --ssh uses ssh -X instead, which is the way
to get X11 forwarding.
This is the key advantage over srun --pty bash
With srun, a dropped SSH connection kills your session and any running
processes. With sinteractive, you just reconnect and pick up where you
left off.
X11
The launch attaches over ssh -X, so shells started at launch have a
DISPLAY. A later attach goes through srun and does not forward X11;
panes opened after an attach --ssh inherit the server's environment,
not the new client's. If you need X11 in a pane, export DISPLAY=...
there yourself, or keep the original connection.
Cancelling the job¶
Exiting the last shell (type exit or Ctrl+d in every pane) ends the
Slurm job. You can also cancel it from the login node, by name or job id:
Pressing Ctrl+c while a launch is still waiting in the queue cancels the
pending job too.
Waiting for a job to start¶
When the cluster is busy your job may sit in the queue. While it does,
sinteractive shows why it is waiting (Slurm's pend reason — free resources,
higher-priority jobs ahead of you) and, when Slurm can estimate one, the
expected start time:
sinteractive queue shows the same for every job you have, plus the last
day's history with a memory right-sizing hint; --all adds everyone's jobs
in the partitions you can see.
What a session is for¶
A session is a durable place to work from — editing, git, scheduler
queries, and keeping long-lived state across SSH drops. It is not a compute
target: the default interactive partition is the smallest on the cluster,
and anything heavy you run in the session competes with the shell you are
typing in.
Run work in an allocation sized for it instead:
# One-off job
srun -p rna -c 8 --mem 32G -t 1:00:00 -J make-test --comment=make-test -- make test
# Sustained work: hold one allocation and reuse it
salloc --no-shell -p rna -c 32 --mem 96G -t 4:00:00 -J cargo-ci --comment=cargo-ci
srun --overlap --jobid=ID -- cargo build --release
scancel ID
Name every job in both fields — -J NAME and --comment=NAME, the same short
descriptive value — so the queue says what is running and why:
SLURM_* is stripped from a session, so srun and salloc run from inside
one create their own allocations rather than steps of the session's job.
Environment variables¶
Set personal defaults in your ~/.bashrc; explicit flags always win.
| Variable | Description | Default |
|---|---|---|
SINTERACTIVE_TIME |
Default wall time (8h, 2d, D-HH:MM:SS) |
24:00:00 |
SINTERACTIVE_PARTITION |
Default partition | interactive |
SINTERACTIVE_QOS |
Default QOS (--qos); needed on schedulers that require one |
unset |
SINTERACTIVE_CPUS |
Default CPU count | 2 |
SINTERACTIVE_MEM |
Default memory (16G) |
8G |
SINTERACTIVE_MOUSE |
on/1/true/yes or off/0/false/no |
on |
SINTERACTIVE_CACHE |
State files and the extracted zellij bundle; must be visible from the compute nodes | $XDG_CACHE_HOME/sinteractive or ~/.cache/sinteractive |
SINTERACTIVE_THEME |
dark, light, or auto (ask the terminal — but not from inside a session, where the answer would come back too late to use; set it there if your terminal is light) |
auto |
SINTERACTIVE_COLOR |
auto/always/never for CLI output; NO_COLOR also honoured |
auto |
SINTERACTIVE_WARN_YELLOW |
Seconds left at which the bar turns yellow | 3600 |
SINTERACTIVE_WARN_RED |
Seconds left at which the bar turns red | 600 |
SINTERACTIVE_GRACE |
Seconds before the walltime limit at which the session ends itself cleanly | 10 |
SINTERACTIVE_POLL |
Seconds between scheduler re-checks in the session (floor 5) | 30 |
SINTERACTIVE_MONITOR_SESSIONS |
Show your other sinteractive sessions in the monitor panel alongside your real jobs | off |
SINTERACTIVE_AGENT_WARN |
Seconds left below which the Claude Code prompt hook warns | 1800 |
SINTERACTIVE_WORKTREES |
Where the Claude Code worktree hook puts worktrees (<here>/<repo>/<name>) |
/scratch/alpine/$USER/worktrees where that scratch exists, else <repo>/.claude/worktrees |
SINTERACTIVE_QUOTA_POLL |
Seconds between storage-quota checks (floor 30) | 600 |
SINTERACTIVE_QUOTA_FILE |
Pipe-delimited file of hard quotas | /cluster/scripts/quota_current.txt |
SINTERACTIVE_QUOTA_HOSTS |
Quota daemons to sum usage across | Bodhi's 172.20.8.110-118 |
SINTERACTIVE_QUOTA_PORT |
Port those daemons listen on | 9878 |
SINTERACTIVE_QUOTA_TIMEOUT |
Seconds to wait for each daemon | 5 |
SINTERACTIVE_SHARE |
Where claude install finds the skills (a checkout) |
beside the binary |
SINTERACTIVE_RUNTIME_DIR |
Node-local directory for the zellij socket and readiness marker | /tmp |
SINTERACTIVE_JOB_ID, SINTERACTIVE_NAME |
Exported inside a session; not for you to set |
# Example: a bigger default allocation, cache on a filesystem with room
export SINTERACTIVE_MEM=16G
export SINTERACTIVE_CPUS=4
export SINTERACTIVE_CACHE=/projects/$USER/.cache/sinteractive
Configuring for Alpine (CU Boulder)¶
The defaults match Bodhi, but everything scheduler-specific is overridable. On Alpine three things differ:
- CPU partition + QOS — the general-purpose CPU queue is
acpuand an explicit--qosis mandatory.acpu/cpu-normalare the names that took effect with Alpine's 2026-08-05 rename ofamilan/normal; both name sets are accepted. /homeis 2 GB — put the cache on/projects.- name clash on
PATH— Alpine already provides an older,screen-basedsinteractivein/usr/local/bin, which is ahead of~/.local/binonPATH. Analiasforces your copy to win.
Add this to your ~/.bashrc:
# Use the ~/.local/bin copy instead of Alpine's older /usr/local/bin one
alias sinteractive="$HOME/.local/bin/sinteractive"
export SINTERACTIVE_PARTITION=acpu # CPU queue (was 'amilan' pre-2026-08-05)
export SINTERACTIVE_QOS=cpu-normal # 1-day max walltime; QOS is required on Alpine
export SINTERACTIVE_CACHE=/projects/$USER/.cache/sinteractive
Then sinteractive launches a 1-day CPU session. For a longer run (up to
7 days), override the QOS: sinteractive --time=2d --qos=cpu-long. The default
account (amc-general for most users) is applied automatically; pass
--account=<name> if you need a different allocation. Alpine has no quota
daemons, so sinteractive quota reports "unavailable" there — curc-quota
is the tool.
Configuring for Bodhi¶
Nothing to set: the built-in defaults are Bodhi's (interactive partition,
no QOS, the quota daemons and /cluster/scripts/quota_current.txt). Longer
sessions go to the normal partition (sinteractive -t 1-12:00:00 -p
normal), GPU work to gpu (-p gpu --gres=gpu:1).
Over-quota sessions carry a red QUOTA over by … notice, checked every ten
minutes against the cluster's quota daemons. The check is cached per user,
not per session, so six open sessions do not mean six times the polling.
After deleting something, don't wait out the interval:
sinteractive quota --check # re-checks now, updates every open session
# OVER QUOTA: 30.2T of 30T used (100.7%), over by 204.8G
# Quota OK: 24.1T of 30T used (80.3%)
Tab completion¶
make install installs completions for bash, zsh and fish (generated by the
binary itself: sinteractive gen completions bash|zsh|fish). Start a new shell
after installing to pick them up. zsh needs ~/.local/share/zsh/site-functions
on $fpath.