Terminal Çoklayıcı: tmux ile Çoklu Oturum Yönetimi

Uzak bir sunucuya SSH ile bağlandın, uzun sürecek bir işlem başlattın ve tam o sırada bağlantın koptu. Saatler süren bir iş mahvoldu, baştan başlamak zorundasın. Bu acı deneyimi yaşayan her sistem yöneticisi er ya da geç tmux ile tanışır. tmux, terminal çoklayıcı dünyasının en güçlü ve esnek aracıdır. Bir kez öğrendiğinde “bunu nasıl bu kadar geç öğrendim” diye düşüneceksin.

tmux Nedir ve Neden Kullanmalısın?

tmux, “terminal multiplexer” yani terminal çoklayıcı anlamına gelir. Tek bir terminal penceresinde birden fazla oturum, pencere ve panel açmana olanak sağlar. Ama asıl gücü şuradan geliyor: oturumların arka planda çalışmaya devam etmesi. SSH bağlantın kopsa bile tmux oturumu sunucuda yaşamaya devam eder, geri bağlandığında kaldığın yerden devam edersin.

Günlük sistem yönetimi senaryolarında tmux şu durumlarda hayat kurtarır:

  • Uzun süren veritabanı yedekleme işlemleri
  • Büyük dosya transferleri veya rsync operasyonları
  • Birden fazla log dosyasını eş zamanlı takip etme
  • Farklı sunuculara aynı anda bağlı kalma
  • Pair programming veya uzaktan destek senaryoları
  • Uzun derleme işlemleri (kernel derleme, büyük projeler)

GNU Screen ile karşılaştırıldığında tmux çok daha modern bir mimariyle geliyor. Pane yönetimi, pencere düzenleme ve scriptlenebilirlik açısından Screen’i çok geride bırakıyor.

Kurulum

Tmux neredeyse tüm Linux dağıtımlarında paket depolarında hazır olarak bulunuyor.

# Debian/Ubuntu
sudo apt update && sudo apt install tmux

# RHEL/CentOS/Rocky Linux
sudo dnf install tmux

# Arch Linux
sudo pacman -S tmux

# macOS (Homebrew)
brew install tmux

# Kurulum sonrası versiyon kontrolü
tmux -V

Versiyon 3.x ve üzeri kullanmanı öneririm. Eski sürümlerde bazı özellikler eksik olabiliyor.

Temel Kavramlar: Session, Window, Pane

tmux’u anlamak için üç temel kavramı kavramak gerekiyor:

Session (Oturum): En üst seviyedeki yapı. Bir sunucuya bağlandığında açtığın tmux oturumu. Birden fazla session aynı anda çalışabilir ve birbirinden bağımsızdır. Oturumdan “detach” olabilirsin, arka planda çalışmaya devam eder.

Window (Pencere): Her session içinde birden fazla pencere açabilirsin. Tarayıcıdaki sekmeler gibi düşün. Her pencere bağımsız bir terminal ortamı sunar.

Pane (Panel): Her pencere içinde ekranı yatay veya dikey olarak bölebilirsin. Aynı anda birden fazla komutu yan yana veya alt alta çalıştırabilirsin.

Bu hiyerarşiyi şöyle düşün: 1 Server > N Session > N Window > N Pane.

İlk Adımlar: Session Yönetimi

# Yeni bir session başlat
tmux

# İsimli session başlat (önerilir!)
tmux new-session -s production

# Kısaltması
tmux new -s development

# Mevcut sessionlara bak
tmux list-sessions
tmux ls

# İsimli session'a bağlan
tmux attach-session -t production
tmux attach -t production

# Son session'a bağlan
tmux attach

# Session'ı öldür
tmux kill-session -t production

# Tüm session'ları öldür
tmux kill-server

Prefix tuşu tmux’un en önemli konseptidir. Tmux’a bir komut göndereceğini belirtmek için önce prefix tuşuna basarsın. Varsayılan prefix Ctrl+b‘dir. Her tmux komutu prefix + tuş kombinasyonuyla çalışır.

Prefix Sonrası Temel Kısayollar

Session yönetimi için prefix (Ctrl+b) ardından:

  • d: Mevcut session’dan detach ol (arka planda çalışmaya devam eder)
  • s: Tüm session’ları listele ve geçiş yap
  • $: Session’ı yeniden adlandır
  • :new: Yeni session oluştur

Window yönetimi için prefix ardından:

  • c: Yeni window oluştur
  • n: Sonraki window’a geç
  • p: Önceki window’a geç
  • 0-9: Numarasına göre window’a geç
  • ,: Window’u yeniden adlandır
  • w: Window listesini göster
  • &: Mevcut window’u kapat

Pane yönetimi için prefix ardından:

  • %: Dikey böl (yan yana iki pane)
  • : Yatay böl (üst-alt iki pane)
  • o: Sonraki pane’e geç
  • q: Pane numaralarını göster
  • x: Mevcut pane’i kapat
  • z: Pane’i maximize et / geri al
  • {: Pane’i sola taşı
  • }: Pane’i sağa taşı
  • Yön tuşları: Pane’ler arası geçiş

Gerçek Dünya Senaryosu 1: Sunucu Bakımı

Diyelim ki bir üretim sunucusunda bakım yapıyorsun. Aynı anda log’ları izlemen, servis durumlarını kontrol etmen ve komutlar çalıştırman gerekiyor.

# Bakım session'ı oluştur
tmux new -s server-maintenance

# Ekranı 3 pane'e böl
# Prefix + % ile dikey böl
# Prefix + " ile yatay böl

# Sol üst pane: log takibi
tail -f /var/log/syslog

# Prefix + o ile sağ pane'e geç
# Sağ üst pane: servis izleme
watch -n 2 'systemctl status nginx mysql'

# Sağ pane'i yatay böl (Prefix + ")
# Alt pane: komut çalıştırma
# Bu pane'de bakım komutlarını çalıştır

Bakım ortasında bağlantın kopsa bile tmux attach -t server-maintenance ile kaldığın yerden devam edersin. Tüm pane’ler, çalışan komutlar, her şey seni bekliyor olacak.

Gerçek Dünya Senaryosu 2: Deployment Takibi

Bir uygulama deployment’ı yapıyorsun ve birden fazla süreci takip etmen gerekiyor.

# Deployment session'ı oluştur
tmux new -s deploy

# Window 1: Deployment scripti
# Prefix + c ile yeni window aç
# Window 1 adını değiştir: Prefix + , -> "deploy-script"
./deploy.sh production

# Yeni window aç (Prefix + c)
# Window 2 adını değiştir: "app-logs"
tail -f /var/log/myapp/application.log

# Yeni window aç (Prefix + c)
# Window 3 adını değiştir: "monitoring"
watch -n 3 'ps aux | grep myapp && netstat -tulpn | grep 8080'

# Prefix + w ile window listesine bak ve geçiş yap

Bu sayede deploy scriptini çalıştırırken aynı anda log’ları ve process durumunu anlık takip edebilirsin.

tmux Konfigürasyonu: .tmux.conf

Varsayılan tmux ayarları biraz can sıkıcı olabilir. ~/.tmux.conf dosyasıyla her şeyi özelleştirebilirsin. İşte pratik ve kullanışlı bir konfigürasyon:

# ~/.tmux.conf

# Prefix'i Ctrl+a olarak değiştir (screen kullanıcıları için daha alışkın)
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix

# Mouse desteğini etkinleştir
set -g mouse on

# Renk desteği
set -g default-terminal "screen-256color"

# Session numaralandırmasını 1'den başlat
set -g base-index 1
setw -g pane-base-index 1

# Geçmiş buffer boyutunu artır
set -g history-limit 50000

# Pencere numaralarını otomatik düzenle
set -g renumber-windows on

# Status bar özelleştirme
set -g status-position bottom
set -g status-bg colour234
set -g status-fg colour137
set -g status-left '#[fg=colour233,bg=colour241,bold] #S '
set -g status-right '#[fg=colour233,bg=colour241,bold] %d/%m/%Y %H:%M '
set -g status-right-length 50
set -g status-left-length 20

# Pane bölme için daha akılda kalıcı tuşlar
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# Pane'ler arası vim tarzı geçiş
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Konfigürasyonu yeniden yükle
bind r source-file ~/.tmux.conf ; display "Config reloaded!"

# Pane boyutlandırma
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

Konfigürasyonu yüklemek için:

# Mevcut tmux içinden
tmux source-file ~/.tmux.conf

# Veya prefix + r (yukarıdaki konfigürasyonla)

Copy Mode: Çıktıları Kopyalamak

tmux’un en kullanışlı özelliklerinden biri copy mode. Ekranda kayan çıktıları yakalamak, arama yapmak ve kopyalamak için kullanılır.

Prefix + [ ile copy mode’a gir. Ardından:

  • Yön tuşları veya HJKL: Gezinme
  • /: İleri arama
  • ?: Geri arama
  • n: Sonraki eşleşme
  • Space: Seçim başlat
  • Enter: Seçimi kopyala
  • Prefix + ]: Yapıştır
  • q: Copy mode’dan çık
# Vi tarzı copy mode için .tmux.conf'a ekle
setw -g mode-keys vi

# Vi copy mode tuş bağlamaları
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
bind-key -T copy-mode-vi r send-keys -X rectangle-toggle

tmux Scriptleme: Ortamları Otomatik Kur

Tmux’un gerçek gücü scriptlenebilir olmasından geliyor. Her gün aynı pencere düzenini manuel kurmak yerine bir script yazabilirsin.

#!/bin/bash
# ~/bin/dev-environment.sh
# Geliştirme ortamını otomatik kur

SESSION="development"

# Session zaten varsa bağlan
tmux has-session -t $SESSION 2>/dev/null

if [ $? != 0 ]; then
    # Session oluştur
    tmux new-session -d -s $SESSION -n "editor"

    # Window 1: Editor
    tmux send-keys -t $SESSION:1 "cd ~/projects/myapp && vim ." C-m

    # Window 2: Server
    tmux new-window -t $SESSION:2 -n "server"
    tmux send-keys -t $SESSION:2 "cd ~/projects/myapp && npm start" C-m

    # Window 3: Git ve komutlar
    tmux new-window -t $SESSION:3 -n "git"
    tmux send-keys -t $SESSION:3 "cd ~/projects/myapp && git status" C-m

    # Window 4: Log takibi (bölünmüş)
    tmux new-window -t $SESSION:4 -n "logs"
    tmux split-window -h -t $SESSION:4
    tmux send-keys -t $SESSION:4.1 "tail -f /var/log/nginx/access.log" C-m
    tmux send-keys -t $SESSION:4.2 "tail -f /var/log/myapp/error.log" C-m

    # İlk window'dan başla
    tmux select-window -t $SESSION:1
fi

# Session'a bağlan
tmux attach-session -t $SESSION
# Script'i çalıştırılabilir yap
chmod +x ~/bin/dev-environment.sh

# Alias ekle
echo "alias dev='~/bin/dev-environment.sh'" >> ~/.bashrc
source ~/.bashrc

# Artık sadece "dev" yaz
dev

Pane Senkronizasyonu: Çoklu Sunucu Yönetimi

Bu özellik gerçekten sihirli. Birden fazla pane’e aynı anda aynı komutu göndermek istediğinde pane senkronizasyonu kullanırsın.

# Birden fazla sunucuya SSH ile bağlan, her biri ayrı pane'de
# Pane 1: ssh user@server1
# Pane 2: ssh user@server2
# Pane 3: ssh user@server3

# Senkronizasyonu etkinleştir
# Prefix + : ardından:
:setw synchronize-panes on

# Artık yazdığın her komut tüm pane'lere gönderilir
sudo apt update && sudo apt upgrade -y

# İş bitince senkronizasyonu kapat
:setw synchronize-panes off

Bu özelliği bir alias ile daha kolay kullanabilirsin:

# .tmux.conf'a ekle
bind e setw synchronize-panes on
bind E setw synchronize-panes off

Cluster update’leri, konfigürasyon dağıtımı veya aynı komutu birden fazla sunucuda çalıştırma senaryolarında inanılmaz zaman kazandırır.

tmux Plugin Manager (TPM) ile Eklenti Yönetimi

tmux’u daha da güçlendirmek için TPM kullanabilirsin:

# TPM'i yükle
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

# .tmux.conf'a ekle
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

# TPM'i başlat (dosyanın sonuna)
run '~/.tmux/plugins/tpm/tpm'

tmux-resurrect eklentisi muhteşem bir özellik sunuyor: sunucu yeniden başlasa bile tmux oturumlarını ve pane içeriklerini kurtarıyor. tmux-continuum ise bu kaydetme işlemini otomatikleştiriyor.

# TPM'i yüklemek için tmux içinden
# Prefix + I

# Eklentileri güncellemek için
# Prefix + U

# tmux-resurrect ile kaydet
# Prefix + Ctrl+s

# tmux-resurrect ile geri yükle
# Prefix + Ctrl+r

Faydalı tmux Komutları ve İpuçları

# Tüm tmux komutlarını listele
tmux list-commands

# Mevcut tuş bağlamalarını göster
tmux list-keys

# Bir session içindeki window'ları listele
tmux list-windows -t production

# Bir window içindeki pane'leri listele
tmux list-panes -t production:1

# Belirli bir pane'e komut gönder (bağlı olmadan)
tmux send-keys -t production:1.2 "sudo systemctl restart nginx" Enter

# Pane'in içeriğini dosyaya kaydet
tmux capture-pane -t production:1.1 -p > /tmp/pane-output.txt

# Session'ı başka kullanıcıyla paylaş (pair programming)
# Aynı socket'i kullanan başka bir tmux bağlantısı aç
tmux -S /tmp/shared new-session -s shared
# Diğer kullanıcı bağlansın
tmux -S /tmp/shared attach

Yaygın Sorunlar ve Çözümleri

Renk sorunları: Terminal’in 256 renk desteklediğinden emin ol.

# .bashrc veya .zshrc'ye ekle
export TERM=xterm-256color

# tmux içinden kontrol
echo $TERM

Escape tuşunda gecikme: Özellikle vim kullanıcıları için can sıkıcı.

# .tmux.conf'a ekle
set -sg escape-time 0

SSH agent yönlendirme sorunları:

# .tmux.conf'a ekle
set -g update-environment "SSH_AUTH_SOCK SSH_AGENT_PID"

Tmux oturumunu başka kullanıcıya devretme: Bazen root olmadan açtığın bir session’a sudo ile giermen gerekebilir.

# Oturumu kaydet ve kullanıcı değiştir
sudo su -
tmux attach -t 0  # Session numarasına göre

.bashrc Entegrasyonu

Terminali her açtığında tmux’u otomatik başlatmak veya mevcut session’a bağlanmak için:

# ~/.bashrc veya ~/.zshrc sonuna ekle
if command -v tmux &> /dev/null && [ -n "$PS1" ] && 
   [[ ! "$TERM" =~ screen ]] && 
   [[ ! "$TERM" =~ tmux ]] && 
   [ -z "$TMUX" ]; then
    # "main" adında session yoksa oluştur, varsa bağlan
    tmux new-session -A -s main
fi

Bu sayede her SSH bağlantısında otomatik olarak tmux’a girmiş olursun.

Sonuç

tmux, her sistem yöneticisinin araç kutusunda olması gereken bir uygulama. Öğrenme eğrisi ilk başta biraz dik görünebilir, özellikle prefix konsepti ve kısayollar alışması zaman alabilir. Ama bir hafta düzenli kullanımın ardından tmux olmadan nasıl çalıştığını merak eder hale geliyorsun.

En önemli alışkanlık: Her önemli işi tmux session içinde başlatmak. Özellikle uzak sunucularda uzun sürecek işlemler, deployment’lar, yedekleme scriptleri hep tmux altında çalıştırılmalı. Bağlantı kopması korkusu olmadan rahatça çalışabilmek, sistem yönetimi deneyimini kökten değiştiriyor.

Başlangıç için önerdiğim yol haritası: Önce temel session yönetimini öğren, sonra pane bölmeyi kavra, ardından .tmux.conf ile kendi konfigürasyonunu oluştur. Kısayolları ezberlemeye çalışma, pratik yaparak öğren. Ve mutlaka senin çalışma ortamına özel bir başlangıç scripti yaz. Bir kez kurduğunda, her yeni terminali açtığında aynı düzeni saniyeler içinde hazır hale getirirsin.

tmux-resurrect eklentisiyle birleştiğinde artık sunucu reboot’larından bile korkmaz hale geliyorsun. Sistem yönetiminde bu seviyede bir konfor gerçekten paha biçilemez.

Yorum yapın