SSH ke server, jalankan python manage.py runserver, lalu koneksi putus dan prosesnya ikut mati. Kalau kamu sering deploy atau ngoprek server, kejadian ini pasti familier. tmux menyelesaikannya dengan satu konsep sederhana: proses berjalan di sesi yang tidak terikat ke koneksi SSH-mu. Koneksi boleh putus, sesi tetap hidup, dan kamu tinggal attach lagi untuk melanjutkan. tmux juga bisa memecah satu jendela terminal jadi banyak panel dan window, jadi nggak perlu buka lima tab SSH cuma untuk tail log, edit config, dan jalankan server bersamaan.
Kenapa tmux, bukan sekadar tab terminal
Tab terminal (atau fitur split di iTerm2/Terminator) memang nyaman, tapi hidup di sisi klien — begitu SSH putus, semuanya hilang. tmux berjalan di server. Sesi, window, dan panel hidup di mesin remote, sehingga kamu bisa detach dari satu laptop dan attach dari laptop lain tanpa kehilangan apa pun. Alternatif tertua, GNU screen, masih ada dan tetap dipakai, tapi tmux lebih aktif dikembangkan, config-nya lebih bersih, dan sudah jadi standar de facto di kebanyakan server modern.
Install tmux
tmux tersedia hampir di semua distro Linux dan juga macOS lewat Homebrew. Install sesuai sistemmu:
# Debian / Ubuntu
sudo apt update && sudo apt install -y tmux
# Fedora / RHEL
sudo dnf install -y tmux
# macOS (Homebrew)
brew install tmux
Cek versinya untuk memastikan install berhasil:
tmux -V
# tmux 3.5a
Pahami hierarkinya: server, sesi, window, panel
Sebelum mulai menekan shortcut, pahami empat lapis ini. Server adalah proses tmux pertama yang berjalan di background. Di dalamnya ada satu atau beberapa sesi — tiap sesi punya nama, misalnya dev atau prod. Satu sesi berisi beberapa window (mirip tab), dan satu window bisa dipecah jadi beberapa panel. Kebanyakan pemula bingung di dua istilah ini: window untuk berpindah "halaman", panel untuk membelah layar jadi dua area kerja berdampingan. Kalau keempat istilah ini melekat, semua shortcut selanjutnya terasa logis.
Membuat, melihat, dan menutup sesi
Cara tercepat mulai: jalankan tmux polos, atau langsung kasih nama biar gampang diingat.
# Mulai sesi baru tanpa nama
tmux
# Mulai sesi dengan nama
tmux new -s dev
# Lihat daftar sesi yang sedang berjalan
tmux ls
# Attach (masuk) ke sesi yang sudah ada
tmux attach -t dev
# Attach ke sesi paling baru
tmux attach
Untuk keluar dari tmux tanpa menghentikan proses di dalamnya, kamu detach, bukan menutup jendela terminal. Tekan prefix lalu d (kependekan dari "detach"). Sesi tetap jalan di background dan bisa kamu attach lagi kapan saja.
Jangan pakai exit untuk keluar kalau kamu masih mau lanjut. exit menutup shell di panel itu, dan kalau itu panel terakhir di window terakhir, sesinya ikut mati. Untuk sekadar pergi sementara, detach dengan prefix + d.
Prefix key: gerbang semua perintah
Hampir semua perintah tmux diawali prefix key. Default-nya Ctrl+b — tekan Ctrl+b, lepas, lalu tekan satu huruf lain. Jadi Ctrl+b d berarti: tahan Ctrl dan tekan b, lepas keduanya, baru tekan d. Kalau kamu pernah pakai GNU screen, ini setara Ctrl+a. Banyak orang me-rebind prefix jadi Ctrl+a supaya lebih dekat ke jari kelingking — kita bahas di bagian config.
Membelah layar jadi panel
Fitur yang paling sering dipakai. Begini cara memecah window jadi beberapa panel:
# Belah kiri-kanan (split vertikal)
Ctrl+b %
# Belah atas-bawah (split horizontal)
Ctrl+b "
# Pindah kursor antar panel
Ctrl+b <arrow>
# Ubah ukuran panel
Ctrl+b <Ctrl+arrow>
# Zoom panel jadi fullscreen (tekan lagi untuk kembali)
Ctrl+b z
# Tutup panel
Ctrl+b x # lalu konfirmasi dengan y
Window: tab ala tmux
Kalau panel membelah satu layar, window berperan seperti tab untuk pindah "halaman" kerja yang berbeda. Misalnya window 1 untuk coding, window 2 untuk log, window 3 untuk database.
# Buat window baru
Ctrl+b c
# Pindah ke window berikutnya / sebelumnya
Ctrl+b n
Ctrl+b p
# Lompat ke window nomor tertentu
Ctrl+b 0
# Ganti nama window
Ctrl+b ,
# Tutup window
Ctrl+b &
Copy mode: scroll dan copy tanpa mouse
Ini bagian yang bikin orang baru sering stuck: log panjang nggak bisa di-scroll pakai mouse. Itu normal — secara default scroll mouse di dalam tmux tidak menelusuri riwayat tmux. Ada dua jalan keluar: aktifkan copy mode dengan prefix + [, atau (lebih gampang) nyalakan mouse support di config supaya scroll mouse langsung jalan.
Tambahkan set -g mouse on di ~/.tmux.conf lalu reload dengan prefix + : diikuti source-file ~/.tmux.conf. Setelah itu scroll mouse, klik untuk memilih panel, dan drag untuk resize panel semuanya berfungsi.
# Aktifkan mode vi (biar navigasinya mirip vim)
set -g mode-keys vi
# Masuk copy mode
Ctrl+b [
# Navigasi ala vim: h j k l, / untuk search
# Mulai seleksi: Space, gerakkan kursor, Enter untuk copy
# Paste hasil copy
Ctrl+b ]
Konfigurasi ~/.tmux.conf biar makin nyaman
Kekuatan tmux yang sebenarnya ada di config. Berikut contoh ~/.tmux.conf yang saya pakai sendiri — rebind prefix ke Ctrl+a, aktifkan mouse, set index window mulai dari 1, dan rapikan status bar.
# ~/.tmux.conf
# Prefix jadi Ctrl+a (lebih dekat dari Ctrl+b)
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# Mouse: scroll, klik pindah panel, drag resize
set -g mouse on
# Window & panel mulai dari angka 1
set -g base-index 1
setw -g pane-base-index 1
# Mode vi untuk copy mode
set -g mode-keys vi
# Reload config cepat dengan prefix + r
bind r source-file ~/.tmux.conf \; display-message "Config reloaded"
# Status bar minimalis
set -g status-right "#[fg=green]#S "
set -g status-left ""
Setelah menyimpan file, reload lewat prefix + r (sudah kita bind di config). Mulai sekarang prefix kamu adalah Ctrl+a, bukan Ctrl+b.
Scripting: bangun workspace lengkap dengan satu perintah
Kalau tiap pagi kamu buka sesi dev, split dua panel, buka window untuk log dan satu lagi untuk editor, otomatiskan saja. Ini contoh script yang membangun workspace itu dalam sekali jalan — dan contoh bagus kenapa dasar-dasar Bash scripting layak dikuasai.
#!/usr/bin/env bash
# dev-workspace.sh
SESSION="dev"
# Mulai sesi ter-detach (biar script tidak hang)
tmux new-session -d -s "$SESSION" -n editor
# Window 2 untuk log
tmux new-window -t "$SESSION" -n logs
# Kembali ke window editor, split jadi dua panel
tmux select-window -t "$SESSION:editor"
tmux split-window -h -p 30
# Jalankan perintah di masing-masing panel
tmux send-keys -t "$SESSION:editor.0" "nvim ~/proyek" Enter
tmux send-keys -t "$SESSION:editor.1" "cd ~/proyek" Enter
tmux send-keys -t "$SESSION:logs.0" "tail -f ~/proyek/logs/app.log" Enter
# Attach ke sesi
tmux attach -t "$SESSION"
Jalankan bash dev-workspace.sh, dan kamu langsung mendarat di workspace yang sama persis setiap kali. Untuk proyek yang lebih besar ada tool seperti tmuxinator yang baca config YAML, tapi script Bash polos seperti ini sudah cukup untuk mayoritas kasus.
Menjaga sesi tetap hidup setelah reboot
tmux menjaga sesi saat SSH putus, tapi bukan saat server reboot. Kalau kamu menjalankan aplikasi yang harus terus hidup, jangan andalkan tmux — itu tugas service manager. Di Linux, jalankan aplikasinya lewat systemd seperti yang dibahas di panduan menjalankan aplikasi Python sebagai service systemd. tmux cocok untuk sesi kerja interaktif, bukan daemon jangka panjang. Untuk memulihkan sesi tmux setelah reboot, ada plugin tmux-resurrect yang menyimpan dan mengembalikan layout sesi secara otomatis.
Gunakan tmux untuk sesi kerja interaktif: editing, tailing log, iterasi cepat. Untuk proses yang harus selalu jalan — API, worker, bot — pakai systemd. Keduanya bukan saingan, mereka mengisi kebutuhan yang berbeda.
Bagaimana cara keluar dari tmux tanpa menghentikan proses?
Detach dengan prefix + d (default Ctrl+b d, atau Ctrl+a d kalau kamu sudah rebind). Sesi tetap berjalan di background dan bisa di-attach lagi dengan tmux attach -t nama-sesi.
Kenapa scroll mouse tidak berfungsi di dalam tmux?
Scroll mouse tidak aktif secara default. Tambahkan set -g mouse on di ~/.tmux.conf, reload config, dan scroll mouse langsung berfungsi untuk menelusuri riwayat output.
Apa bedanya detach dan kill-session?
Detach hanya melepas sesi dari klien — proses di dalamnya tetap jalan. tmux kill-session -t nama benar-benar menghentikan sesi dan semua proses di dalamnya. Pakai kill hanya saat kamu yakin sudah selesai.