Screen Komutu ile Uzak Oturumları Canlı Tutma

Uzak sunucularda çalışırken en can sıkıcı deneyimlerden biri, saatlerce süren bir işlemin ortasında internet bağlantısının kopması ve her şeyin sıfırlanmasıdır. Bir veritabanı migrasyonu, uzun süren bir derleme işlemi ya da kritik bir yedekleme görevi… Hepsi bir anda çöpe gidebilir. İşte tam bu noktada screen komutu hayat kurtarıcı olarak devreye giriyor.

screen, GNU projesi tarafından geliştirilen bir terminal multiplexer aracıdır. Temel olarak şunu yapmanızı sağlar: bir SSH bağlantısı üzerinden başlattığınız oturumu, bağlantıyı kessaniz bile sunucu üzerinde canlı tutmak. Sonra istediğiniz zaman geri dönüp kaldığınız yerden devam etmek. Bu kadar basit ama bu kadar güçlü.

Screen Neden Bu Kadar Önemli?

Klasik bir senaryo düşünelim. Cuma akşamı saat 22:00’de production sunucusuna bağlandınız, büyük bir paket güncellemesi başlattınız. İşlem 45 dakika sürecek. Siz kahve almak için mutfağa gittiğinizde laptop’ınız uyku moduna geçti, SSH bağlantısı koptu. Sunucuya geri döndüğünüzde ne göreceğinizi bilemezsiniz. İşlem yarıda mı kaldı? Sistem tutarsız bir durumda mı?

screen kullanıyor olsaydınız bu sorun hiç yaşanmazdı. Bağlantı koptuğunda süreç arka planda çalışmaya devam ederdi, siz sabah işe gelip tam ekranda nerede kaldığınızı görerek devam edebilirdiniz.

Bunun dışında screen‘in sunduğu başka avantajlar da var:

  • Çoklu pencere yönetimi: Tek bir terminal üzerinden birden fazla pencere açabilirsiniz
  • Ekran paylaşımı: Aynı screen oturumuna birden fazla kişi bağlanabilir, bu sayede canlı troubleshooting yapılabilir
  • Oturum kalıcılığı: Sunucu yeniden başlatılmadığı sürece oturumunuz kaybolmaz
  • Log tutma: Screen oturumundaki tüm çıktıları otomatik olarak dosyaya yazabilirsiniz

Kurulum

Çoğu Linux dağıtımında screen varsayılan olarak kurulu gelir. Gelmiyorsa kurulumu oldukça basittir.

# Debian/Ubuntu
sudo apt-get install screen

# RHEL/CentOS/Rocky Linux
sudo yum install screen
# veya
sudo dnf install screen

# Arch Linux
sudo pacman -S screen

# Kurulumu doğrulayın
screen --version

Temel Kullanım

İlk Screen Oturumunu Başlatmak

En basit haliyle sadece screen yazmanız yeterli:

screen

Bu komutu çalıştırdığınızda kısa bir splash screen görürsünüz (Enter’a basarak geçebilirsiniz) ve normal bir terminal açılır. Görünürde hiçbir şey değişmemiş gibi görünür ama artık bir screen oturumunun içindesinizdir.

Daha pratik olan yöntem ise oturuma baştan bir isim vermektir:

screen -S veritabani-migrasyonu

Bu sayede daha sonra hangi oturuma bağlanacağınızı karıştırmazsınız. Production ortamlarında çalışan herkesin bu alışkanlığı edinmesi gerektiğini düşünüyorum.

Temel Klavye Kısayolları

Screen’in tüm komutları Ctrl+A ön ekiyle başlar. Bu kombinasyona önce basıp bıraktıktan sonra komut tuşuna basmanız gerekir.

  • Ctrl+A, D: Oturumdan ayrıl (detach) – oturum arka planda çalışmaya devam eder
  • Ctrl+A, C: Yeni pencere oluştur
  • Ctrl+A, N: Sonraki pencereye geç
  • Ctrl+A, P: Önceki pencereye geç
  • Ctrl+A, “: Tüm pencerelerin listesini göster
  • Ctrl+A, K: Mevcut pencereyi kapat (kill)
  • Ctrl+A, ?: Yardım menüsünü aç
  • Ctrl+A, A: Ekran adını değiştir
  • Ctrl+A, [: Scroll moduna gir (kaydırma için ok tuşları)
  • Ctrl+A, ]: Scroll modundan çık

Oturumları Listelemek ve Yeniden Bağlanmak

Mevcut screen oturumlarını listelemek için:

screen -ls

Çıktı şuna benzer bir şey olacaktır:

There are screens on:
    12345.veritabani-migrasyonu    (Detached)
    12346.log-analizi              (Attached)
2 Sockets in /var/run/screen/S-kullanici.

Burada iki önemli durum görürsünüz: Detached (oturumdan ayrılmış, arka planda çalışıyor) ve Attached (şu anda biri bağlı).

Bir oturuma yeniden bağlanmak için:

# İsim ile bağlanma
screen -r veritabani-migrasyonu

# ID ile bağlanma
screen -r 12345

# Eğer oturum Attached durumdaysa zorla bağlanma
screen -d -r veritabani-migrasyonu

-d -r kombinasyonu özellikle önemlidir. Diyelim ki başka bir yerden oturuma bağlısınız ya da bağlantı düzgün kapanmadı ve oturum Attached görünüyor. Bu komut önce oturumu detach eder, sonra sizin bağlanmanızı sağlar.

Gerçek Dünya Senaryoları

Senaryo 1: Uzun Süren Sistem Güncellemesi

Diyelim ki 200 paket güncellemesi yapacaksınız ve işlemin yarıda kalmasını istemiyorsunuz:

# Önce screen oturumu aç
screen -S sistem-guncelleme

# İçinde güncellemeyi başlat
sudo apt-get update && sudo apt-get upgrade -y

# Ctrl+A, D ile güvenle ayrıl
# Birkaç saat sonra geri dön
screen -r sistem-guncelleme

Senaryo 2: Birden Fazla Sunucuyu Aynı Anda İzleme

Tek bir screen oturumunda birden fazla pencere açarak farklı log dosyalarını veya işlemleri takip edebilirsiniz:

# Screen oturumu başlat
screen -S monitoring

# İlk pencerede system log izle
tail -f /var/log/syslog

# Ctrl+A, C ile yeni pencere aç
# Bu pencerede uygulama logunu izle
tail -f /var/log/nginx/error.log

# Ctrl+A, C ile bir pencere daha aç
# Burada da CPU/memory izle
htop

# Ctrl+A, " ile pencereler arası geçiş yap

Senaryo 3: Ekip Arkadaşıyla Canlı Troubleshooting

Bu benim en sevdiğim özelliklerden biri. Aynı sunucuya bağlı iki kişi aynı screen oturumunu paylaşabilir:

# Kullanici1: screen oturumu başlatır
screen -S canli-debug

# Kullanici2: aynı oturuma bağlanır
screen -x kullanici1/canli-debug

-x parametresi ile multi-attach modunda bağlanırsınız. Her iki kullanıcı da aynı ekranı görür ve klavyeye basılan her tuş her ikisi tarafından da işlenir. Junior bir ekip üyesine bir şey gösterirken veya senior’dan yardım alırken bu özellik inanılmaz kullanışlıdır.

Senaryo 4: Screen İçinde Otomatik Log Tutma

Kritik bir işlem yapıyorsanız ve her şeyi kaydetmek istiyorsanız:

# Log tutma ile oturum başlat
screen -L -S kritik-islem

# Ya da oturum içindeyken
# Ctrl+A, H ile log kaydını aç/kapat

Log dosyası varsayılan olarak ~/screenlog.0 adıyla kaydedilir. Her Ctrl+A, H basışında log kaydı açılıp kapatılır. Audit trail için veya işlem çıktısını incelemek için son derece işe yarar.

Gelişmiş Özellikler ve İpuçları

Screen’i Komut ile Başlatmak

Bir komutu direkt screen içinde çalıştırmak istiyorsanız:

# Komutu screen içinde çalıştır ve oturuma isim ver
screen -dmS yedekleme /scripts/backup.sh

# -d: Detached modda başlat
# -m: Yeni oturum oluştur
# -S: İsim ver

-dm kombinasyonu özellikle cron job’larında veya init scriptlerinde kullanışlıdır. Komut direkt arka planda başlar ve siz sonra istediğinizde bağlanıp durumu kontrol edebilirsiniz.

Oturuma Komut Göndermek

Bağlanmadan oturum içindeki bir pencereye komut göndermek mümkün:

# Bağlı olmadığınız bir screen oturumuna komut gönder
screen -S yedekleme -X stuff "ls -lan"

Bu özellik otomasyon scriptlerinde çok işe yarar. Örneğin bir screen oturumunu izleyip belirli bir çıktı görüldüğünde komut göndermek istiyorsanız bunu kullanabilirsiniz.

Screen Yapılandırması: .screenrc Dosyası

screen‘i her seferinde aynı ayarlarla kullanmak istiyorsanız home dizininizde .screenrc dosyası oluşturun:

# ~/.screenrc

# Status bar ekle (alt kısımda)
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'

# Scroll buffer boyutunu artır
defscrollback 10000

# Başlangıç mesajını kapat
startup_message off

# Bell sesini kapat
vbell on

# Otomatik detach (bağlantı kopunca)
autodetach on

# UTF-8 desteği
defutf8 on

# Pencere numarasını 1'den başlat
bind c screen 1
bind ^c screen 1
bind 0 select 10
screen 1

Bu yapılandırmayı ekledikten sonra screen’in alt kısmında pencere listesini ve sistem bilgilerini gösteren bir status bar göreceksiniz. Bu sayede hangi pencerede olduğunuzu her zaman bilirsiniz.

Scroll Geçmişini Kullanmak

Varsayılan olarak terminal çıktısını kaydırabilmek için scroll moduna girmeniz gerekir:

# Ctrl+A, [ ile scroll moduna gir
# Ok tuşları veya PgUp/PgDn ile kaydır
# Q veya Enter ile çık

.screenrc dosyasında defscrollback 10000 satırını eklediyseniz 10.000 satır geriye kadar gidebilirsiniz. Uzun log çıktılarını incelemek için hayat kurtarıcı.

Screen Sorunları ve Çözümleri

“There is no screen to be resumed” Hatası

Bu hatayı aldığınızda oturumun gerçekten var olup olmadığını kontrol edin:

screen -ls

# Eğer liste boşsa oturum yok demektir
# Eğer liste varsa tam adı yazdığınızdan emin olun
screen -r tam-oturum-adi

Ölü Oturumları Temizlemek

Bazen screen oturumları düzgün kapatılmadan kalabilir. Bu “Dead” veya yanıt vermeyen oturumlar birikirsler:

# Dead oturumları temizle
screen -wipe

# Belirli bir oturumu zorla sil
screen -S oturum-adi -X quit

Oturum Boyutu Sorunu

Farklı terminal boyutlarından bağlanıldığında ekran boyutu küçük kalabilir. Bunu çözmek için:

# Bağlanırken ekranı yeniden boyutlandır
screen -d -r oturum-adi

# .screenrc'ye ekle
termcapinfo xterm* ti@:te@

Başka Kullanıcının Screen Oturumuna Erişim

Aynı sunucuda başka bir kullanıcının screen oturumuna bağlanmak için o kullanıcının soketine erişim gerekir:

# Root olarak başka kullanıcının oturumuna bağlan
sudo -u kullanici screen -r

# Ya da su ile geç
su - kullanici
screen -r

Screen vs Tmux: Hangisini Seçmeli?

Bu soruyu sıkça alıyorum. Kısa cevap: ikisi de harika araçlar, hangisini kullandığınız büyük ölçüde alışkanlık meselesi.

Screen tercih etmeniz gereken durumlar:

  • Sunucu üzerinde sadece screen kuruluysa (kurumsal ortamlarda yaygın)
  • Basit, hafif bir araç istiyorsanız
  • Ekip arkadaşlarınız screen kullanıyorsa ve ortak oturum paylaşımı gerekiyorsa

Tmux’u düşünmeniz gereken durumlar:

  • Daha modern ve aktif geliştirilen bir araç istiyorsanız
  • Yatay/dikey pencere bölme özelliği (split panes) önemliyse
  • Daha kolay yapılandırma ve plugin desteği istiyorsanız

Benim kişisel görüşüm: uzak sunucularda screen, kendi geliştirme ortamımda tmux kullanıyorum. Screen’in her yerde kurulu olma garantisi onu production sunucuları için daha güvenilir kılıyor.

Pratik İpuçları ve Alışkanlıklar

Yıllarca screen kullandıktan sonra öğrendiğim bazı pratik ipuçları:

  • Her zaman anlamlı isim verin: screen -S ile başladığınız oturuma ne yaptığınızı anlatan bir isim koyun. 3 ay sonra 5 tane isimsiz oturuma bakıp ne olduğunu anlamaya çalışmak çok can sıkıcı.
  • Detach alışkanlığı edinin: SSH bağlantısını kapatmadan önce her zaman Ctrl+A, D ile düzgün ayrılın. Bu şekilde oturum temiz bir şekilde arka planda kalır.
  • Cron job’larında screen kullanın: Uzun süren cron işlerini screen içinde başlatın. Bu sayede hem çalışırken bağlanıp kontrol edebilir, hem de çıktıyı kaçırmazsınız.
  • Log tutmayı alışkanlık haline getirin: Kritik işlemler yaparken Ctrl+A, H ile log kaydını açın. Sorun çıktığında ne olduğunu görmek çok kolaylaşır.
  • Makul scroll buffer boyutu ayarlayın: .screenrc‘de defscrollback değerini en az 5000 yapın. Uzun komut çıktılarını kaçırmamak için önemli.
  • Her bağlantı sonrası screen -ls kontrolü: Bir sunucuya bağlandığınızda önce bu komutu çalıştırın. Devam eden işlemler varsa haberdar olursunuz.

Gerçek Dünya: Kritik Bir Durumdan Kurtulmak

Birkaç yıl önce production veritabanı üzerinde büyük bir tablo yeniden yapılandırması yapıyorduk. İşlem tahminen 3-4 saat sürecekti ve gece yarısı başlamak zorundaydık. O geceyi şöyle organize ettik:

# Production sunucusuna bağlan
ssh prodserver-db01

# Screen oturumu başlat ve logla
screen -L -S db-restructure-20231015

# İşlemleri başlat
sudo -u postgres psql -d production_db -f /tmp/alter_tables.sql

# Ctrl+A, D ile ayrıl, eve git, uyu
# Sabah tekrar bağlan
screen -r db-restructure-20231015

# Hem işlemin tamamlandığını gör, hem de tam log kaydına sahip ol

O gece ev interneti bir ara kesildi. Screen olmasaydı ya orada bekleyecektik ya da işlemi sabaha erteleyecektik. Screen sayesinde sabah işe geldiğimizde tüm işlem başarıyla tamamlanmıştı ve screenlog.0 dosyasında her adımın kaydı mevcuttu.

Sonuç

screen komutu, bir Linux sistem yöneticisinin araç kutusunda mutlaka bulunması gereken, öğrenmesi kolay ama faydası muazzam bir araçtır. SSH üzerinden çalışıyorsanız ve henüz screen veya benzeri bir terminal multiplexer kullanmıyorsanız, bu yazıyı okuduktan sonra en az bir kez denemenizi şiddetle tavsiye ederim.

Temel mantık basit: başlat, işini yap, ayrıl, geri dön. Bu döngüyü kavradığınızda uzak sunucu yönetimi çok daha rahat ve güvenli hale gelir. Bağlantı kesintisi artık sizi korkutmaz, gece yarısı başlatılan işlemler için başında beklemeniz gerekmez.

Başlangıç için .screenrc yapılandırmasıyla oturmayı, anlamlı oturum isimleri vermeyi ve screen -L ile log tutmayı alışkanlık haline getirmenizi öneririm. Zamanla diğer özellikleri de keşfedeceksiniz ve bir süre sonra screen olmadan nasıl çalıştığınızı merak edeceksiniz.

Yorum yapın