tmux (terminal multiplexer) menjalankan terminalmu di dalam sesi yang hidup di server, bukan di laptopmu. Kamu bisa meninggalkan sesi itu dan kembali lagi nanti, dan semua yang jalan di dalamnya tetap jalan. Mirip kamar kos: kamu bisa pergi (detach) dan pulang lagi (attach), barang-barangmu tetap di tempatnya, dan di dalamnya kamu bisa punya beberapa ruangan (window) yang masing-masing bisa disekat jadi beberapa bagian (pane).
🧪 Tebakan cepat: kamu menjalankan
npm run builddi dalam tmux di server, lalu WiFi-mu putus. Apa yang terjadi pada build-nya? Tebak dulu, jawabannya ada di bagian "Detach dan attach: sesinya tetap hidup".
Session, window, pane
tmux punya tiga tingkat. Ini sesi di Lab, sama dengan sesi di latihan:
session "dev"
├── window 0 "editor" (3 pane)
│ ├── pane 0
│ ├── pane 1
│ └── pane 2
└── window 1 "server" (2 pane)
├── pane 0
└── pane 1
- Session: satu kumpulan kerja yang punya nama, misalnya
dev. Inilah yang tetap hidup di server. - Window: satu tampilan penuh di dalam sesi, seperti tab di browser. Nomornya mulai dari 0.
- Pane: potongan di dalam satu window, yang terlihat bersamaan. Window baru selalu mulai dengan 1 pane, dan tiap kali dibelah, pane-nya bertambah 1.
Baris hijau di bawah layar tmux adalah status bar: [dev] 0:editor* 1:server-. Tanda * menandai window yang sedang dibuka, - window yang terakhir dibuka sebelumnya.
Prefix: Ctrl+b dulu, baru tombolnya
Semua shortcut tmux dimulai dengan prefix: tekan Ctrl+b, lepas, lalu tekan tombolnya. Tanpa prefix, tombol itu diketik biasa ke shell.
| Tombol | Aksinya | Perintah tmux-nya |
|---|---|---|
| Ctrl+b c | bikin window baru | new-window |
| Ctrl+b n / Ctrl+b p | window berikutnya / sebelumnya | next-window / previous-window |
| Ctrl+b 0 sampai 9 | loncat ke window nomor itu | select-window |
| Ctrl+b , | ganti nama window | rename-window |
| Ctrl+b % | belah pane jadi kiri dan kanan | split-window -h |
| Ctrl+b " | belah pane jadi atas dan bawah | split-window -v |
| Ctrl+b o | pindah ke pane berikutnya (atau Ctrl+b lalu panah) | select-pane |
| Ctrl+b z | zoom pane yang aktif jadi satu layar penuh, tekan lagi untuk kembali | resize-pane -Z |
| Ctrl+b x | tutup pane, setelah konfirmasi y |
kill-pane |
| Ctrl+b d | detach: keluar, sesinya tetap jalan | detach-client |
| Ctrl+b [ | mode scroll, q untuk keluar |
copy-mode |
Hati-hati dengan namanya: tmux menyebut % sebagai split horizontal (-h), karena pane-nya berjajar ke samping.
Detach dan attach: sesinya tetap hidup
deploy@web-1:~$ tmux new -s dev
Perintah itu membuka sesi dev. Di dalamnya kamu menjalankan npm run build, lalu menekan Ctrl+b d:
[detached (from session dev)]
deploy@web-1:~$ tmux ls
dev: 2 windows (created Thu Oct 8 14:37:02 2026)
deploy@web-1:~$ tmux attach -t dev
tmux new -s devbikin sesi bernamadev. Nama lengkapnyatmux new-session -s dev.tmux ls(list-sessions) menampilkan sesi yang masih hidup. Kalau gak ada sama sekali:no server running on /tmp/tmux-1000/default.tmux attach -t dev(attach-session) masuk lagi, dan semua window, pane, serta program di dalamnya masih ada. Kalau namanya salah:can't find session: dev.
Kalau koneksi SSH-mu putus, yang mati cuma sambunganmu ke tmux. Sesinya, termasuk npm run build di dalamnya, tetap jalan di server. Itu jawaban tebakannya. Tinggal SSH lagi, lalu tmux attach -t dev. Tanpa tmux, shell-mu ikut ditutup saat SSH putus, dan build-nya mati karena sinyal SIGHUP (dari pelajaran Process Management).
Di latihan: model sesi tmux dengan JavaScript
Latihannya meminta createTmuxSession(name): function yang menyimpan daftar window di dalamnya, lalu mengembalikan object berisi method. Pola menyimpan data di dalam function seperti ini disebut closure:
function createCounter() {
let count = 0; // cuma bisa diubah lewat method di bawah
return {
add() { count = count + 1; return count; },
};
}
const c = createCounter();
console.log(c.add()); // 1
console.log(c.add()); // 2
Dengan pola yang sama, ini yang terjadi di latihan, untuk sesi dev:
| Panggilan | Kembaliannya | Keadaan sesudahnya |
|---|---|---|
s.addWindow("editor") |
0 |
editor: 1 pane |
s.addWindow("server") |
1 |
server: 1 pane |
s.splitPane(0, "h") |
2 |
editor: 2 pane |
s.splitPane(0, "v") |
3 |
editor: 3 pane |
s.splitPane(1, "h") |
2 |
server: 2 pane |
s.detach() |
"detached: dev" |
gak menempel lagi |
addWindowmengembalikan nomor window baru, jadi selalu satu kurang dari jumlah window sesudahnya.splitPanemengembalikan jumlah pane window itu setelah dibelah. Arah"h"atau"v"cuma mengubah tata letak, bukan jumlahnya.listWindows()[0]berisinameeditordanpaneCount3.
⚠️ Jebakan yang sering ketemu
- Lupa prefix. Menekan
dsaja cuma mengetik huruf d di shell. Selalu Ctrl+b dulu, lepas, baru tombolnya. - Mengetik
exitpadahal maksudnya detach.exitmenutup pane-nya. Kalau itu pane terakhir di window terakhir, sesinya ikut berakhir ([exited]) dan semua program di dalamnya mati. Untuk keluar sementara, pakai Ctrl+b d. - Bikin sesi baru setiap login. Sesi lama masih ada dan menumpuk, dan
tmux new -s devkedua kalinya ditolak denganduplicate session: dev. Cek dulu dengantmux ls, lalutmux attach -t dev. - Menjalankan tmux di dalam tmux. tmux menolak:
sessions should be nested with care, unset $TMUX to force. Kamu sudah di dalam sesi; pakai Ctrl+b c untuk window baru.
TL;DR: tmux menjalankan terminal di dalam sesi yang hidup di server. Sesi berisi window (seperti tab), window berisi pane (potongan yang terlihat bersamaan); window baru mulai dengan 1 pane. Semua shortcut dimulai dengan prefix Ctrl+b: c window baru, n/p pindah window, % belah kiri-kanan, " belah atas-bawah, o pindah pane, z zoom, x tutup pane, d detach. tmux new -s dev bikin sesi, tmux ls daftar sesi, tmux attach -t dev masuk lagi. SSH putus gak membunuh sesinya, jadi build yang jalan di dalam tmux tetap jalan.