Posted on -
🧠 TL;DR

De fleste starter Claude Code direkte fra en terminal i VS Code eller lignende. Det er fint.

Men hvis du har en Raspberry Pi eller en lille Linux-boks stående i hjørnet — så brug den. SSH ind og kør agenten inde i tmux.

Luk din laptop. Disconnect. Gå i seng. Agenten kører videre.


Problemet

De fleste kører deres AI-agent på den oplagte måde: åbn en terminal i VS Code, skriv claude, og lad den arbejde. Det er fint. Terminalen bliver åben, agenten kører, du kigger med.

Det her blogindlæg handler ikke om det tilfælde.

Det her handler om det tilfælde hvor du allerede har en lille maskine stående — en Raspberry Pi i hjørnet, en billig VPS, en gammel laptop der kører Linux. Du SSH'er ind. Du starter agenten. Den går i gang.

Så går din laptop i sleep. Din VPN dropper. Du lukker terminalen ved et uheld. Eller du vil bare i seng.

Og agenten dør med den.

Grunden er simpel: når du SSH'er ind og kører en kommando, så bliver den kommando child af din SSH-session. Lukker du sessionen, så sender kernen SIGHUP til alle child-processer. Game over.


Løsningen

Brug tmux.

Tmux er en terminal multiplexer. Oversat: den kører din shell inde i en session der lever på serveren, ikke på din laptop.

Når du "detacher" fra tmux, kører sessionen videre på serveren. Din SSH-forbindelse kan dø. Din laptop kan gå i sleep. Agenten mærker intet.


Hvordan det virker under hjelmen

Tmux kører som en server-proces på maskinen. Første gang du starter den, forker den en daemon der ejer alle dine sessions, windows og panes.

Når du "attacher" til en session, bliver din terminal en klient af den daemon. Dine keystrokes bliver forwarded til den shell der kører inde i sessionen. Shellens output bliver forwarded tilbage til din terminal.

Detach, og klienten disconnecter. Daemonen og shellen kører videre. Agenten derinde har ingen anelse om der er sket noget — dens stdin, stdout og stderr er wired til tmux-daemonen, ikke til din SSH-session.

Det er pointen: agentens parent-proces er tmux-daemonen, ikke din shell. Så når SSH dør, går SIGHUP til din SSH-shell, ikke til agenten.


Setup

Installer tmux. På Debian/Ubuntu/Raspberry Pi OS:

sudo apt update
sudo apt install tmux

På Fedora/RHEL:

sudo dnf install tmux

På macOS:

brew install tmux

Det er hele setuppet. Ingen config-fil nødvendig for at komme i gang.


De tre kommandoer du reelt har brug for

# Start en ny navngivet session
tmux new -s ai

# Detach fra den (agenten kører videre)
Ctrl+b  then  d

# Reattach senere, fra hvor som helst
tmux attach -t ai

Et par ekstra der er praktiske:

# List kørende sessions
tmux ls

# Kill en session du ikke længere har brug for
tmux kill-session -t ai

# Attach til den seneste session
tmux a

Ctrl+b er default prefix key. Hver tmux-kommando starter med den. Tryk Ctrl+b og så d for at detache. Tryk Ctrl+b og så ? for at se alle keybindings.


Et typisk workflow

# Fra din laptop
ssh pi@raspberrypi.local

# På Pi'en
tmux new -s ai
claude-code   # eller hvilken agent du nu kører

# Agenten går i gang. Du trykker Ctrl+b og så d.
# Du er tilbage i Pi'ens almindelige shell.

exit          # luk SSH. Laptop må gerne sove.

Næste morgen:

ssh pi@raspberrypi.local
tmux attach -t ai
# Du er tilbage inde i den kørende agent. Output og det hele.

Hvorfor det betyder noget for AI-workloads

AI-agenter er sjældent hurtige.

De:

  • kører lange loops
  • venter på API-kald
  • processerer store inputs
  • crasher hvis de bliver afbrudt midt i noget
  • brænder nogle gange rigtige penge pr. token

En droppet SSH-session betyder en tabt run. Nogle gange et tabt dataset. Nogle gange en halv-færdig refactor på tværs af 40 filer.

Tmux fjerner laptoppen fra ligningen helt.


Begrænsninger og gotchas

Tmux er ikke persistent på tværs af reboots. Reboot'er serveren, så er alle sessions væk. Hvis du har brug for det, så kig på tmux-resurrect og tmux-continuum, eller kør din agent under systemd i stedet.

Scrollback er endelig. Default-history er 2000 linjer pr. pane. For en snakkesalig agent er det ingenting. Tilføj dette til ~/.tmux.conf:

set -g history-limit 100000

Copy-paste er sin egen ting. Inde i tmux: Ctrl+b [ går i copy mode. Brug piletaster eller / til at søge, mellemrum til at starte selection, enter til at kopiere. For paste: Ctrl+b ]. Eller slå bare mouse mode til: set -g mouse on i din config.

Nested tmux er akavet. Hvis du SSH'er ind til en server der allerede kører tmux, og du starter tmux igen, så kolliderer prefix-key'et. Send prefix'et til den indre session ved at trykke Ctrl+b to gange.

Daemonen kører som din user. Hvis en anden logger ind som dig, kan de tmux attach og kigge med i din session. Ikke et problem for en Pi der står på dit skrivebord. Værd at vide på en delt boks.


Kan man det her på Windows?

Tmux er POSIX-only. Den kører ikke på rå Windows.

Men du har tre gode muligheder:

1. WSL2. Windows Subsystem for Linux giver dig en rigtig Linux-kernel. Installer Ubuntu fra Microsoft Store og så sudo apt install tmux. Virker præcis som på en rigtig Linux-boks. Det er det jeg vil anbefale til lokalt brug.

2. SSH ind til en Linux-boks fra Windows. PowerShell har haft en indbygget ssh-klient siden Windows 10. Åbn PowerShell, ssh pi@raspberrypi.local, og kør så tmux på Pi'en. Det at din klient er PowerShell er irrelevant — tmux kører på Pi'en, ikke på din laptop.

3. PowerShell på agent-siden? Nej. PowerShell som shell kører fint inde i tmux på Linux (installer pwsh, kør det inde i en tmux-session). Men hvis din agent er et Windows-native PowerShell-script der kræver Windows-API'er, så kan tmux ikke hjælpe. Brug Start-Job, Register-ScheduledTask, eller kør det som en Windows service. Eller flyt agenten til WSL2 og brug tmux derinde.

Kort svar: hvis din agent kører på Linux (inkl. en Pi eller WSL2) så er tmux det rigtige værktøj. Hvis den skal køre på native Windows, så brug Windows' egne background-job-mekanismer.


En minimal config der er værd at have

Smid dette i ~/.tmux.conf:

# Mere scrollback
set -g history-limit 100000

# Mouse support (scroll, resize panes, click to select)
set -g mouse on

# Start window-nummerering ved 1
set -g base-index 1

# Reload config med Ctrl+b r
bind r source-file ~/.tmux.conf \; display "Config reloaded"

Reload med tmux kill-server og start forfra, eller Ctrl+b :source-file ~/.tmux.conf.


Alternativer der er værd at kende

screen — den originale terminal multiplexer. Virker stadig. Er installeret default på flere systemer end tmux. Syntaksen er anderledes, men idéen er den samme.

nohup og & — nohup ./agent & kører en kommando immune over for SIGHUP og detacher den. Fint til fire-and-forget. Ubrugeligt hvis du har brug for at interagere med agenten senere.

systemd-units — det rigtige svar til noget der skal overleve reboots og restart'e ved fejl. Overkill til ad-hoc agent-kørsler. Perfekt til produktion.

zellij — moderne tmux-alternativ. Pænere defaults, bedre discoverability. Værd at kigge på hvis tmux' keybindings irriterer dig.

Til en agent du babysitter interaktivt, men ikke vil have bundet til din laptop: tmux. Til en agent der skal køre altid: systemd.


Slutbemærkning

Kør agenten på den normale måde hvis det virker for dig. Terminal i VS Code, tryk go, kig med.

Men hvis du allerede har en Pi eller en lille server kørende — brug den. Den går ikke i sleep. Det gør din laptop.

Kør agenten på det der er vågent.

tmux new -s ai

Og luk skærmen uden skyldfølelse.

Table of Contents