Takip et

nohup Nedir ve Neden Kullanılır?

Linux sistemlerinde uzun süreli işlemler çalıştırırken veya terminal oturumunuzu kapattığınızda bile belirli bir komutun çalışmaya dev

Linux sistemlerinde uzun süreli işlemler çalıştırırken veya terminal oturumunuzu kapattığınızda bile belirli bir komutun çalışmaya devam etmesini istediğinizde karşılaşılan yaygın bir sorun vardır: terminal kapandığında veya bağlantı kesildiğinde, o terminalde başlatılan tüm süreçler genellikle sonlanır. İşte bu noktada nohup komutu devreye girer. Bu rehberde, nohup‘un ne olduğunu, nasıl çalıştığını ve Linux ortamında uzun soluklu görevlerinizi kesintisiz bir şekilde nasıl yöneteceğinizi ayrıntılı olarak inceleyeceğiz.

Linux sistem yöneticileri, geliştiriciler ve hatta günlük kullanıcılar için nohup, arka planda güvenilir bir şekilde işlem yürütmenin temel araçlarından biridir. Bu komut, özellikle SSH bağlantısı üzerinden bir sunucuda çalışırken ve bağlantınızın kesilmesi durumunda işinizin yarıda kalmamasını istediğiniz durumlarda paha biçilmezdir.

nohup Nedir ve Neden Kullanılır?

nohup (no hang up) kelimesinin kısaltmasıdır ve adından da anlaşılacağı gibi “kapanma” veya “bağlantı kesilmesi” sinyalini (SIGHUP) yok saymak için tasarlanmıştır. Linux ve Unix benzeri işletim sistemlerinde, bir terminal oturumu kapatıldığında veya bir SSH bağlantısı kesildiğinde, işletim sistemi genellikle bu terminalde başlatılan tüm alt süreçlere bir SIGHUP sinyali gönderir. Bu sinyal, varsayılan olarak süreçlerin sonlandırılmasına neden olur.

nohup komutu, çalıştırdığınız komutun bu SIGHUP sinyalini almasını engeller. Böylece, terminal oturumunuzu kapatsanız veya ağ bağlantınız kopsa bile, nohup ile başlatılan süreç arka planda çalışmaya devam eder. Bu, özellikle aşağıdaki senaryolarda kritik bir öneme sahiptir:

  • Uzun süreli veri işleme veya analiz görevleri
  • Arka planda çalışması gereken sunucu uygulamaları veya servisler
  • Büyük dosyaların indirilmesi veya yüklenmesi
  • Derleme veya kod oluşturma işlemleri

nohup‘u kullanmanın temel amacı, bir sürecin yaşam döngüsünü terminal oturumundan bağımsız hale getirmektir. Bu, sisteminizin kararlılığını artırır ve beklenmedik bağlantı kesintileri nedeniyle iş kaybını önler.

nohup Komutunun Temel Kullanımı

nohup komutunun temel sözdizimi oldukça basittir. Genellikle, çalıştırmak istediğiniz komutun önüne nohup eklemeniz yeterlidir. Ayrıca, komutun arka planda çalışmaya devam etmesini sağlamak için sonuna & işaretini eklemek yaygın bir uygulamadır. Aksi takdirde, komut hala ön planda çalışır ve terminali meşgul eder, ancak SIGHUP sinyalinden etkilenmez.

Temel Sözdizimi:

nohup komut [argümanlar] &

nohup ile bir komut çalıştırdığınızda, komutun standart çıktısı (stdout) ve standart hatası (stderr) varsayılan olarak bulunduğunuz dizinde nohup.out adlı bir dosyaya yönlendirilir. Eğer bu dosya mevcut değilse oluşturulur, mevcutsa çıktılar sonuna eklenir.

Örnek 1: Basit Bir Komutu Arka Planda Çalıştırma

Diyelim ki 60 saniye boyunca uyuyacak basit bir komut çalıştırıyoruz:

nohup sleep 60 &

Bu komutu çalıştırdığınızda, terminal size genellikle sürecin PID’sini (Process ID) ve standart çıktının nohup.out dosyasına yönlendirildiğini bildiren bir mesaj gösterecektir:

[1] 12345
nohup: ignoring input and appending output to 'nohup.out'

Burada 12345, sleep komutunun PID’sidir. Artık terminali kapatabilir veya SSH bağlantısını kesebilirsiniz; sleep 60 komutu arka planda çalışmaya devam edecektir.

Örnek 2: Bir Betiği Çalıştırma

Bir betiği (örneğin, uzun_islem.sh) nohup ile çalıştırmak da benzerdir:

nohup ./uzun_islem.sh &

Bu durumda, uzun_islem.sh betiğinin tüm çıktıları (eğer yönlendirilmezse) nohup.out dosyasına yazılacaktır.

Çalışan Süreçleri Kontrol Etme

nohup ile başlattığınız süreçlerin hala çalışıp çalışmadığını kontrol etmek için ps komutunu kullanabilirsiniz:

ps aux | grep uzun_islem.sh

Veya eğer PID’yi biliyorsanız:

ps -p 12345

nohup Sürecini Sonlandırma

Eğer nohup ile başlattığınız bir süreci durdurmak isterseniz, öncelikle PID’sini bulmanız gerekir (yukarıdaki ps aux | grep örneğindeki gibi). Ardından kill komutunu kullanabilirsiniz:

kill 12345

Eğer süreç sonlanmazsa, daha agresif bir sonlandırma sinyali olan -9 ile tekrar deneyebilirsiniz:

kill -9 12345

Çıktı Yönlendirme ve Gelişmiş Kullanım

nohup‘un varsayılan olarak çıktıyı nohup.out dosyasına yönlendirmesi genellikle yeterli olsa da, bazen çıktıyı belirli bir dosyaya yönlendirmek veya standart hatayı (stderr) ayrı olarak ele almak isteyebilirsiniz. Bu, hata ayıklama ve günlük kaydı için oldukça kullanışlıdır.

Özel Bir Dosyaya Çıktı Yönlendirme

Standart çıktıyı (stdout) belirli bir dosyaya yönlendirmek için > operatörünü kullanırız:

nohup ./my_script.sh > script_output.log &

Bu komut, my_script.sh‘nin tüm standart çıktılarını script_output.log dosyasına yazacaktır. nohup.out dosyası bu durumda oluşturulmayacaktır (çünkü stdout başka bir yere yönlendirildi).

Standart Çıktı ve Standart Hatayı Aynı Dosyaya Yönlendirme

Genellikle hem standart çıktıyı hem de standart hatayı aynı dosyaya yönlendirmek istenir. Bu, 2>&1 operatörü ile yapılır:

nohup ./my_script.sh > script_output.log 2>&1 &

Burada:

  • > script_output.log: Standart çıktıyı (dosya tanımlayıcı 1) script_output.log dosyasına yönlendirir.
  • 2>&1: Standart hatayı (dosya tanımlayıcı 2) standart çıktının (dosya tanımlayıcı 1) yönlendirildiği yere (yani script_output.log‘a) yönlendirir.

Bu, nohup ile uzun süreli işlemler çalıştırırken en sık kullanılan ve önerilen yöntemdir, çünkü hem başarılı çıktıları hem de olası hataları tek bir yerde toplar.

Girdiyi /dev/null’dan Okuma

Bazı komutlar, terminalden girdi bekleyebilir. nohup ile bir komutu arka planda çalıştırırken, komutun girdi beklemesi durumunda donmasını veya hata vermesini önlemek için standart girdiyi (stdin) /dev/null‘dan okumak iyi bir pratiktir:

nohup ./my_script.sh < /dev/null > script_output.log 2>&1 &

< /dev/null ifadesi, komutun herhangi bir girdi beklediğinde boş bir kaynaktan okumasını sağlar ve böylece sürecin terminal bağlantısı olmadan takılmasını engeller.

Daha Gelişmiş Alternatifler: screen ve tmux

nohup, basit ve etkili bir çözüm olsa da, terminal oturumu yönetiminde daha fazla esneklik ve özellik sunan screen ve tmux gibi araçlar da bulunmaktadır. Bu araçlar, birden fazla terminal oturumu oluşturmanıza, bunlar arasında geçiş yapmanıza ve hatta mevcut bir oturuma daha sonra yeniden bağlanmanıza olanak tanır. Eğer nohup'un ötesinde bir şeye ihtiyacınız varsa, bu araçları araştırmanız faydalı olacaktır. Ancak, basit bir komutun terminalden bağımsız çalışmasını sağlamak için nohup genellikle en hızlı ve en kolay çözümdür.

Pratik Senaryolar ve İpuçları

nohup komutunu günlük Linux kullanımınızda nasıl uygulayabileceğinize dair bazı pratik senaryolar ve ipuçları:

1. Arka Planda Bir Web Sunucusu Çalıştırma

Bir geliştirme web sunucusunu (örneğin, Python'ın basit HTTP sunucusunu) arka planda çalıştırmak isteyebilirsiniz:

nohup python3 -m http.server 8000 > webserver.log 2>&1 &

Bu komut, 8000 portunda bir HTTP sunucusu başlatır ve tüm çıktıları webserver.log dosyasına yönlendirir. Terminali kapattıktan sonra bile sunucu çalışmaya devam edecektir.

2. Uzun Süreli Veritabanı Yedekleme

Büyük bir veritabanının yedeğini almak uzun sürebilir. Bu işlemi nohup ile başlatmak, bağlantı sorunları nedeniyle yedeğin yarıda kalmasını engeller:

nohup mysqldump -u root -p mydatabase > mydatabase_backup.sql 2>&1 &

Şifrenizi girdikten sonra işlem arka planda çalışmaya başlayacaktır.

3. Bir Uygulama Derleme

Büyük bir yazılım projesini derlemek bazen saatler sürebilir. Derleme işlemini nohup ile başlatmak, terminal oturumunuzun kapanması durumunda derlemenin başarısız olmamasını sağlar:

nohup make all > compile.log 2>&1 &

İpuçları:

  • Çıktıları Kontrol Edin: nohup ile başlattığınız bir sürecin çıktısını takip etmek için tail -f script_output.log komutunu kullanabilirsiniz. Bu, dosyanın sonuna eklenen yeni satırları gerçek zamanlı olarak gösterir.
  • Geçerli Dizin: nohup.out dosyası, komutu çalıştırdığınız dizinde oluşturulur. Eğer bu dizine yazma izniniz yoksa, nohup hata verebilir. Bu durumda, çıktıyı yazma izninizin olduğu bir dizine yönlendirin (örneğin, /tmp/output.log).
  • PID'yi Kaydetme: Bazı durumlarda, bir sürecin PID'sini otomatik olarak bir dosyaya kaydetmek isteyebilirsiniz. Bunu echo $! > process.pid komutuyla, nohup komutundan hemen sonra yapabilirsiniz. $!, en son arka planda başlatılan sürecin PID'sini içerir.
nohup ./my_script.sh > script_output.log 2>&1 &
echo $! > my_script.pid
  • Güvenlik ve Performans: nohup, bir sürecin güvenlik veya performansını doğrudan etkilemez. Sadece terminalden bağımsızlığını sağlar. Sürecin kendisi hala sistem kaynaklarını kullanır.
  • Sonuç ve Sıkça Sorulan Sorular

    nohup komutu, Linux'ta uzun soluklu veya terminalden bağımsız çalışması gereken süreçleri yönetmek için basit ama güçlü bir araçtır. SIGHUP sinyalini yok sayarak, terminal oturumu kapansa bile işlemlerinizin kesintisiz devam etmesini sağlar. Bu rehberde, nohup'un temel ve gelişmiş kullanımlarını, çıktı yönlendirme tekniklerini ve pratik senaryolarını ele aldık. Unutmayın ki, daha karmaşık terminal oturumu yönetimi ve çoklu oturum ihtiyaçları için screen veya tmux gibi araçlar daha uygun olabilir, ancak basit arka plan işlemleri için nohup her zaman hızlı ve güvenilir bir seçenektir.

    Sıkça Sorulan Sorular (SSS)

    H3 nohup ile & arasındaki fark nedir?

    & işareti, bir komutu arka planda (background) çalıştırmanızı sağlar, yani terminali serbest bırakır ve başka komutlar girmenize olanak tanır. Ancak, terminal oturumu kapandığında veya SSH bağlantısı kesildiğinde, & ile başlatılan süreçlere SIGHUP sinyali gönderilir ve varsayılan olarak bu süreçler sonlanır. nohup ise, komutun SIGHUP sinyalini yok saymasını sağlar. Dolayısıyla, nohup olmadan & kullanmak, komutun terminal kapandığında sonlanmasını engellemez. Güvenli arka plan çalıştırma için genellikle nohup komut & şeklinde ikisi birlikte kullanılır.

    H3 nohup.out dosyası nereye kaydedilir?

    nohup.out dosyası, nohup komutunu çalıştırdığınız dizine kaydedilir. Eğer o dizine yazma izniniz yoksa, dosya genellikle kullanıcının ana dizinine ($HOME/nohup.out) kaydedilir. Eğer komutun çıktısını belirli bir dosyaya yönlendirirseniz (örneğin, > my_log.log), nohup.out dosyası oluşturulmaz.

    H3 nohup ile başlatılan bir süreci nasıl durdururum?

    Bir nohup sürecini durdurmak için öncelikle sürecin PID'sini (Process ID) bulmanız gerekir. Bunu ps aux | grep "komut_adı" veya pgrep "komut_adı" gibi komutlarla yapabilirsiniz. PID'yi bulduktan sonra, kill PID komutuyla süreci sonlandırabilirsiniz. Eğer süreç yanıt vermezse, kill -9 PID ile zorla sonlandırabilirsiniz.

    H3 nohup yerine daha gelişmiş bir araç var mı?

    Evet, screen ve tmux gibi terminal multiplexer'lar, nohup'tan çok daha gelişmiş özellikler sunar. Bu araçlar, birden fazla terminal oturumu oluşturmanıza, bu oturumları ayırmanıza (detach) ve daha sonra yeniden bağlanmanıza (attach) olanak tanır. Böylece, terminal oturumunuzu kapatsanız bile, tüm sanal oturumlarınız ve içlerindeki süreçler çalışmaya devam eder. nohup tek bir komutu bağımsız hale getirirken, screen/tmux tüm bir terminal ortamını bağımsız hale getirir.

    H3 Neden çıktıyı /dev/null'a yönlendirmeliyim?

    Aslında çıktıyı /dev/null'a yönlendirmek yerine, standart girdiyi (stdin) /dev/null'dan okumak (< /dev/null) daha yaygın ve iyi bir pratiktir. Bunun nedeni, bazı programların kullanıcıdan girdi bekleyebilmesidir. Eğer nohup ile arka planda çalışan bir program girdi beklerse ve bu girdi terminalden sağlanamazsa, program donabilir veya hata verebilir. < /dev/null kullanarak, programın boş bir kaynaktan girdi okumasını sağlarsınız ve bu da programın terminal bağlantısı olmadan sorunsuz çalışmasına yardımcı olur.

    H3 nohup ile başlatılan bir süreci terminali kapattıktan sonra tekrar görebilir miyim?

    Evet, terminali kapattıktan sonra bile nohup ile başlatılan bir süreci ps aux | grep "komut_adı" gibi komutlarla görebilirsiniz. Ancak, bu süreç artık sizin terminal oturumunuzla ilişkilendirilmemiş bir "zombi" veya "orphan" süreç olarak çalışacaktır. jobs komutu sadece mevcut terminal oturumunuzla ilişkilendirilmiş arka plan süreçlerini gösterdiğinden, nohup ile başlatılmış ve terminali kapatılmış bir süreci jobs ile göremezsiniz.

    Yorumlar
    İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
    Yorum Yaz

    Bir yanıt yazın

    E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

    Gönder

    E-posta Bülteni
    Yazılım Topluluğuna Katılın
    En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
    Mobil sürümden çık