nohup komutu: kullanımı, nohup.out ve terminal kapansa da çalışmaya devam etmek
Terminali kapattığınızda ya da SSH bağlantısı koptuğunda bir işin çalışmaya devam etmesi için onu nohup komutuyla başlatın. nohup, terminal kapanırken gelen bağlantı kopma sinyalini (SIGHUP) yok saydırarak komutu çalıştırır. Bir AlmaLinux 9 sunucusunda nohup eklenmiş bir sleep ile eklenmemiş bir sleep birlikte başlatılıp terminal kapatıldığında yalnızca nohup ile başlatılan çalışmaya devam etti.
Aşağıdaki çıktılar bir AlmaLinux 9.8 sunucusunda (root hesabı) ve bir Debian 12 sunucusunda (normal hesap) alındı. Uzun süren bir iş yerine sleep başlatıldı ve durdururken yalnızca başlatırken alınan PID belirtildi. Saatler UTC olarak yazdırıldı.
1️⃣ nohup komutu nasıl kullanılır
nohup çalıştırılacak komutun önüne yazılır ve komutun sonundaki & ile arka planda çalıştırma belirlenir. Resmî GNU kılavuzuna göre nohup'un kendisi komutu arka plana göndermez; bu yüzden & olmadan komut bitene kadar komut istemi geri gelmez.
nohup sleep 300 &[1] 3431609
nohup: ignoring input and appending output to 'nohup.out'[1] iş numarası, 3431609 ise başlatılan sürecin PID'sidir. Ardından çıkan ileti, klavye girdisinin okunmayacağını ve çıktının nohup.out dosyasına ekleneceğini bildiriyor.
Az önce başlattığınız işin PID'si $! içinde kalır. Başlattıktan hemen sonra [echo $!] ile kontrol edip not alırsanız, durumuna bakarken ya da işi sonlandırırken aynı numarayı kullanırsınız.
echo $!3431609Terminal kapanınca kabuk bağlantı kopma sinyalini alır ve aynı sinyali kendi başlattığı işlere de gönderir (resmî Bash kılavuzuna göre). Bunu doğrulamak için yeni bir terminalde [nohup sleep 300 &] ile nohup olmadan [sleep 301 &] birlikte başlatıldı.
sleep 301 &[2] 3432892jobs -l[1]- 3432883 Running nohup sleep 300 &
[2]+ 3432892 Running sleep 301 &İki iş de Running durumundayken terminal penceresi kapatıldı ve başka bir kabuktan iki PID ps ile kontrol edildi.
ps -p 3432883,3432892 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3432883 S 00:05 sleep 300Yalnızca nohup ile başlatılan sleep 300 kaldı; nohup olmadan başlatılan sleep 301 terminal kapanırken birlikte sona erdi.
nohup ile başlatılan bir süreç, Rahatsız Etmeyin modu açık bir telefon gibidir.
nohup, coreutils paketinde bulunan bir komuttur. Kurulu sürümü --version çıktısının ilk satırından görürsünüz. AlmaLinux 9.8 sunucusunda 8.32, Debian 12 sunucusunda 9.1 vardı.
nohup --version | head -1nohup (GNU coreutils) 8.32nohup --version | head -1nohup (GNU coreutils) 9.12️⃣ nohup.out ve çıktı yönlendirme
Çıktının nereye gideceğini belirlemezseniz nohup, komutun çıktısını geçerli klasördeki nohup.out dosyasına ekler. İlk oluşturulan nohup.out 0 bayttı ve izinleri yalnızca onu oluşturan kullanıcının okuyup yazabildiği -rw------- idi.
ls -l nohup.out-rw------- 1 root root 0 Oct 28 23:04 nohup.outResmî GNU kılavuzu, nohup'un nohup.out dosyasını umask ayarından bağımsız olarak yalnızca oluşturan kullanıcının okuyup yazabileceği şekilde oluşturduğunu açıklar. Geçerli klasöre yazamazsa ev klasöründeki $HOME/nohup.out dosyasına yazar, oraya da yazamazsa komutu çalıştırmaz.
Çıktı üreten bir komut nohup ile çalıştırıldığında, komut bittikten sonra çıktı nohup.out içinde kaldı.
nohup sh -c 'echo start; sleep 2; echo end' &[1] 3431985
nohup: ignoring input and appending output to 'nohup.out'cat nohup.outstart
end
[1]+ Done nohup sh -c 'echo start; sleep 2; echo end'Son satırdaki Done, kabuğun işin bittiğini bildiren iletisidir. nohup.out her çalıştırmada yeniden oluşturulmaz, aynı dosyanın sonuna eklenir; bu yüzden aynı klasörden birkaç iş başlatırsanız çıktılar tek bir dosyada karışır.
Her iş için ayrı günlük tutmak isterseniz > ile çıktı dosyasını belirleyin ve 2>&1 ile hata çıktısını da aynı dosyaya gönderin.
nohup sh -c 'echo start; sleep 300' > job.log 2>&1 &[1] 3432059cat job.lognohup: ignoring input
start2>&1 de eklenince terminalde yalnızca iş numarası ve PID göründü, nohup'un bilgi iletisi [nohup: ignoring input] ise günlük dosyasının ilk satırına yazıldı.
Yalnızca > ekleyip 2>&1'i çıkarırsanız terminalde, hata çıktısının standart çıktı dosyasına yönlendirildiğini bildiren bir ileti çıkar.
nohup sleep 300 > job2.log &[2] 3432097
nohup: ignoring input and redirecting stderr to stdoutSaklamanız gerekmeyen işlerin çıktısını /dev/null'a gönderin. Bu durumda da terminalde yalnızca iş numarası ve PID göründü.
nohup sleep 300 > /dev/null 2>&1 &[3] 3432137Dört çalıştırma biçiminde çıktının gittiği yer ve terminalde çıkan ileti aşağıdaki gibidir.
| Çalıştırma biçimi | Çıktının gittiği yer | Terminalde çıkan ileti |
|---|---|---|
| nohup komut & | Geçerli klasördeki nohup.out | nohup: ignoring input and appending output to 'nohup.out' |
| nohup komut > dosya & | Belirtilen dosya (hata çıktısı dahil) | nohup: ignoring input and redirecting stderr to stdout |
| nohup komut > dosya 2>&1 & | Belirtilen dosya | Yok (bilgi iletisi dosyanın ilk satırında) |
| nohup komut > /dev/null 2>&1 & | Atılır | Yok |
3️⃣ nohup süreçlerini kontrol etme ve sonlandırma
jobs listesi yalnızca geçerli kabukta başlatılan işleri gösterir; bu yüzden terminali kapatıp yeniden bağlandıktan sonra nohup sürecini ps -p ile PID belirterek kontrol edin. Aynı kabukta olduğunuz sürece jobs -l iş numarasını, PID'yi ve durumu birlikte gösterir.
jobs -l[1]+ 3431609 Running nohup sleep 300 &ps -p'den sonra PID yazıp -o ile sütunları seçerseniz yalnızca o sürecin satırı çıkar. STAT'taki S, bir olayı bekleyerek uyuduğu durumu; ELAPSED ise başlangıçtan bu yana geçen süreyi gösterir.
ps -p 3431609 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3431609 S 00:03 sleep 300Sonlandırmak için kill komutundan sonra PID'yi yazın.
kill 3431609kill hiçbir şey yazdırmadı; ardından jobs çalıştırılınca iş Terminated olarak göründü ve sonra listeden çıktı.
jobs[1]+ Terminated nohup sleep 300Aynı PID ile ps yeniden çalıştırılınca yalnızca başlık satırı çıktı ve sürecin sona erdiği doğrulandı.
ps -p 3431609 -o pid,stat,etime,cmd PID STAT ELAPSED CMDnohup yalnızca bağlantı kopma sinyalini yok saydığı için aynı sinyali [kill -HUP] ile doğrudan gönderseniz de süreç sona ermez. nohup ile başlatılan sleep 305'e ve nohup olmadan başlatılan sleep 306'ya kill -HUP gönderildi.
kill -HUP 3437119 3437128Ardından jobs -l ile bakıldığında yalnızca nohup tarafı Running olarak kaldı, sleep 306 ise Hangup ile sona erdi.
jobs -l[1]- 3437119 Running nohup sleep 305 &
[2]+ 3437128 Hangup sleep 306kill'e sinyal belirtmezseniz SIGTERM gönderir; bu yüzden nohup ile başlatılan bir iş de [kill PID] ile sona erer.
4️⃣ nohup komutu ile disown karşılaştırması ve seçenekler
🔲 nohup ile disown karşılaştırması
disown, zaten başlatılmış işlerde kullanılan bir bash yerleşik komutudur; nohup olmadan & ile başlatılan bir işi sonradan terminalin bağlantı kopma sinyalinden ayırmak için kullanılır. disown çıktıyı nohup.out'a yönlendirmez; bu yüzden çıktı üreten işlerde, başlatırken > dosya ile çıktının gideceği yeri belirleyin.
Resmî Bash kılavuzuna göre disown seçeneksiz kullanılırsa iş jobs listesinden çıkar; disown -h ise işi listede bırakıp yalnızca bağlantı kopma sinyalinin ona gönderilmesini engeller. Önce sleep 302 başlatıldı, ardından disown çalıştırıldı.
sleep 302 &[1] 3433230disowndisown hiçbir şey yazdırmadı; hemen ardından çalıştırılan jobs -l de boş sonuç verdi.
jobs -lSonra sleep 303 başlatıldı ve iş numarası %1 için disown -h çalıştırıldı.
sleep 303 &[1] 3433343disown -h %1jobs -l ile bakıldığında iş listede kalmaya devam ediyordu.
jobs -l[1]+ 3433343 Running sleep 303 &Buna hiçbir işlem yapılmamış bir sleep 304 daha eklendi, terminal kapatıldı ve başka bir kabuktan üç PID kontrol edildi.
sleep 304 &[2] 3433474ps -p 3433230,3433343,3433474 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3433230 S 00:11 sleep 302
3433343 S 00:08 sleep 303disown ve disown -h uygulanan iki iş kaldı; hiçbir işlem yapılmamış sleep 304 ise sona erdi. Dört yöntemin karşılaştırması aşağıdadır.
| Yöntem | Ne zaman | jobs listesi | Terminal kapandıktan sonra | Çıktı |
|---|---|---|---|---|
| nohup komut & | Başlatırken | Kalır | Kalır | nohup.out veya belirtilen dosya |
| komut & sonra disown | Başlattıktan sonra | Atlanır | Kalır | Değişmez |
| komut & sonra disown -h | Başlattıktan sonra | Kalır | Kalır | Değişmez |
| Yalnızca komut & | — | Kalır | Sona erdi | Değişmez |
Oturum ekranını geri çağırıp yazmaya devam etmeniz gereken işler için tmux gibi bir terminal çoğullayıcı uygundur; bir kez başlatıp yalnızca sonucunu dosyadan aldığınız işler için nohup yeterlidir.
🔲 nohup komutunun seçenekleri
📌 Başlıca seçenekler: bu yazıda çalıştırılan sonuçlar
| Seçenek | Görev | Bu yazıdaki sonuç | |
|---|---|---|---|
| --version | Sürüm bilgisini gösterir ve çıkar | AlmaLinux 9.8 sunucusu: nohup (GNU coreutils) 8.32, Debian 12 sunucusu: nohup (GNU coreutils) 9.1 |
📎 Diğer seçenekler: resmî kılavuza göre
| Seçenek | Görev | |
|---|---|---|
| --help | Yardımı gösterir ve çıkar |
🔲 nohup komutu simülatörü
Aşağıdaki simülatörde nohup ile bir iş başlatıp 🔌 çipiyle terminali kapatıp yeniden bağlanabilir ve hangi süreçlerin kaldığını kendiniz görebilirsiniz.
🔢 SSS & önerilen içerikler
İş zamanlama
Linux: crontab ayarı
Yedekleme veya günlük temizliği gibi belirli saatlerde tekrarlanacak işleri kaydeden Linux zamanlayıcısı crontab'ın ayarlanması.
Süreçler
Linux top komutu (CPU ve bellek kullanımını görme)
CPU ve bellek kullanımını süreç bazında gerçek zamanlı gösteren top komutu.
ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.