Merhaba arkadaşlar, bugün sizlere özellikle uzaktan bağlandığımız sunucularda sıkça karşılaştığımız can sıkıcı bir sorunu ve çözümlerini anlatacağım. SSH bağlantınız koptuğunda çalışan işlemleriniz de duruyor mu? Uzun süren bir yedekleme, derleme veya dosya transferi işlemi yarıda kalıyor mu? O zaman bu rehber tam size göre. nohup ve screen araçlarını kullanarak, terminalinizi kapatsanız bile süreçlerinizin sorunsuz çalışmaya devam etmesini sağlayacağız.
Sorun Nedir?
SSH ile bir sunucuya bağlandığımızda, başlattığımız tüm süreçler o terminal oturumuna (session) bağlıdır. Bağlantı koptuğunda veya terminal penceresini kapattığımızda, sistem oturumu sonlandırır ve bu oturuma bağlı TÜM süreçlere SIGHUP (Hangup) sinyali göndererek onları durdurur. İşte bu sinyali yakalayıp görmezden gelmek veya oturumdan bağımsız çalışacak bir ortam yaratmak bizim çözümümüz olacak.
Çözüm 1: nohup (Basit ve Hızlı)
`nohup` (no hang up), bir komutu başlatarak onun SIGHUP sinyalini almasını engelleyen temel bir araçtır. Kullanımı son derece basittir.
Komutunuzun önüne `nohup` yazmanız ve sonuna `&` işareti ekleyerek arka plana atmanız yeterli. Çıktılar varsayılan olarak çalıştırıldığınız dizindeki `nohup.out` dosyasına yazılır.
Örnek olarak, bir Python betiğini arka planda çalıştıralım:
Komutu çalıştırdıktan sonra size işlem numarasını (PID) verecektir. Bu PID'yi daha sonra kontrol veya sonlandırma için kullanabilirsiniz.
nohup Kullanırken Dikkat
Çıktılar nohup.out dosyasına yazılır. Bu dosya zamanla çok büyüyebilir. Çıktıyı farklı bir dosyaya yönlendirmek isteyebilirsiniz:
Süreci başlattıktan sonra kontrolünüz sınırlıdır. Süreci tekrar ön plana alamazsınız. Sadece PID ile takip edebilir veya sonlandırabilirsiniz.
Sürecin durumunu kontrol etmek için `ps aux | grep PID` veya `jobs` komutunu kullanabilirsiniz.
Çözüm 2: screen (Güçlü ve Esnek)
`nohup` basit işler için idealdir, ancak daha fazla kontrole ihtiyacınız varsa (örneğin, süreçle tekrar etkileşime geçmek) `screen` (veya benzeri `tmux`) kesinlikle vazgeçilmezdir. Screen, birden fazla sanal terminal oturumu yaratmanıza, bunlar arasında geçiş yapmanıza ve oturumları askıya alıp daha sonra tekrar bağlanmanıza olanak tanır.
Öncelikle sisteminizde yüklü değilse kurun:
Screen Temel Komutları
Yeni bir screen oturumu başlatmak:
Bu komut sizi yeni bir pencereye alır. Burada istediğiniz uzun komutu normal şekilde çalıştırın (örn: `python3 script.py`).
Oturumu askıya alıp çıkmak (arka planda çalışmaya devam eder): `Ctrl + A` tuş kombinasyonuna basın, ardından `D` tuşuna basın. (Detach)
Aktif screen oturumlarını listelemek:
Askıdaki bir oturuma tekrar bağlanmak (reattach):
Bir screen oturumunu tamamen sonlandırmak için: Oturumun içindeyken normal şekilde `exit` yazın veya `Ctrl + D` yapın.
Hangi Durumda Hangisini Kullanmalı?
Benim sunucularda genelde şu kuralı uygularım:
nohup: Hızlı, tek seferlik, çıktısını log dosyasından takip edebileceğim ve tekrar etkileşime girmeme gerek olmayan işler için. Örn: Bir yedeği başlatmak, basit bir cron görevi denemek.
screen (veya tmux): Uzun sürecek, ara ara kontrol etmem veya çıktısını canlı görmem gereken, birden fazla komut çalıştıracağım işler için. Örn: Bir sunucuyu yükseltme (upgrade), log dosyasını canlı takip (tail -f), uzun süren bir derleme (compile) işlemi.
Bonus İpucu: tmux
Screen'in daha modern ve gelişmiş bir alternatifi `tmux`tur. Konfigürasyonu daha esnektir, pane bölme özellikleri daha güçlüdür. Alışınca bir daha bırakamazsınız. Kurmak için:
Temel kullanımı screen'e benzer: Yeni oturum `tmux new -s oturum_adi`, oturumdan ayrılma `Ctrl+B` ardından `D`, listeleme `tmux ls`, tekrar bağlanma `tmux attach -t oturum_adi`.
Umarım bu rehber, bağlantı kopması sorununu çözmenize yardımcı olur. Siz bu tarz uzun süreçleri yönetmek için hangi yöntemleri tercih ediyorsunuz? nohup, screen, tmux yoksa başka bir sihirli araç mı? Tecrübelerinizi ve sorularınızı aşağıdaki yorumlarda paylaşmayı unutmayın!
SSH ile bir sunucuya bağlandığımızda, başlattığımız tüm süreçler o terminal oturumuna (session) bağlıdır. Bağlantı koptuğunda veya terminal penceresini kapattığımızda, sistem oturumu sonlandırır ve bu oturuma bağlı TÜM süreçlere SIGHUP (Hangup) sinyali göndererek onları durdurur. İşte bu sinyali yakalayıp görmezden gelmek veya oturumdan bağımsız çalışacak bir ortam yaratmak bizim çözümümüz olacak.
`nohup` (no hang up), bir komutu başlatarak onun SIGHUP sinyalini almasını engelleyen temel bir araçtır. Kullanımı son derece basittir.
Komutunuzun önüne `nohup` yazmanız ve sonuna `&` işareti ekleyerek arka plana atmanız yeterli. Çıktılar varsayılan olarak çalıştırıldığınız dizindeki `nohup.out` dosyasına yazılır.
Bash:
nohup uzun_surecek_komutunuz &
Örnek olarak, bir Python betiğini arka planda çalıştıralım:
Bash:
nohup python3 benim_scriptim.py &
Komutu çalıştırdıktan sonra size işlem numarasını (PID) verecektir. Bu PID'yi daha sonra kontrol veya sonlandırma için kullanabilirsiniz.
Çıktılar nohup.out dosyasına yazılır. Bu dosya zamanla çok büyüyebilir. Çıktıyı farklı bir dosyaya yönlendirmek isteyebilirsiniz:
Bash:
nohup komutunuz > cikti.log 2>&1 &
Sürecin durumunu kontrol etmek için `ps aux | grep PID` veya `jobs` komutunu kullanabilirsiniz.
`nohup` basit işler için idealdir, ancak daha fazla kontrole ihtiyacınız varsa (örneğin, süreçle tekrar etkileşime geçmek) `screen` (veya benzeri `tmux`) kesinlikle vazgeçilmezdir. Screen, birden fazla sanal terminal oturumu yaratmanıza, bunlar arasında geçiş yapmanıza ve oturumları askıya alıp daha sonra tekrar bağlanmanıza olanak tanır.
Öncelikle sisteminizde yüklü değilse kurun:
Bash:
# Debian/Ubuntu için
sudo apt-get install screen
# RHEL/CentOS için
sudo yum install screen
Yeni bir screen oturumu başlatmak:
Bash:
screen -S oturum_adi
Oturumu askıya alıp çıkmak (arka planda çalışmaya devam eder): `Ctrl + A` tuş kombinasyonuna basın, ardından `D` tuşuna basın. (Detach)
Aktif screen oturumlarını listelemek:
Bash:
screen -ls
Bash:
screen -r oturum_adi
# veya sadece PID ile
screen -r 12345
Benim sunucularda genelde şu kuralı uygularım:
nohup: Hızlı, tek seferlik, çıktısını log dosyasından takip edebileceğim ve tekrar etkileşime girmeme gerek olmayan işler için. Örn: Bir yedeği başlatmak, basit bir cron görevi denemek.
screen (veya tmux): Uzun sürecek, ara ara kontrol etmem veya çıktısını canlı görmem gereken, birden fazla komut çalıştıracağım işler için. Örn: Bir sunucuyu yükseltme (upgrade), log dosyasını canlı takip (tail -f), uzun süren bir derleme (compile) işlemi.
Screen'in daha modern ve gelişmiş bir alternatifi `tmux`tur. Konfigürasyonu daha esnektir, pane bölme özellikleri daha güçlüdür. Alışınca bir daha bırakamazsınız. Kurmak için:
Bash:
# Debian/Ubuntu
sudo apt-get install tmux
# RHEL/CentOS
sudo yum install tmux
Temel kullanımı screen'e benzer: Yeni oturum `tmux new -s oturum_adi`, oturumdan ayrılma `Ctrl+B` ardından `D`, listeleme `tmux ls`, tekrar bağlanma `tmux attach -t oturum_adi`.
Umarım bu rehber, bağlantı kopması sorununu çözmenize yardımcı olur. Siz bu tarz uzun süreçleri yönetmek için hangi yöntemleri tercih ediyorsunuz? nohup, screen, tmux yoksa başka bir sihirli araç mı? Tecrübelerinizi ve sorularınızı aşağıdaki yorumlarda paylaşmayı unutmayın!