Linux'ta nohup Komutu Nasıl Kullanılır

Yayınlanan: 2022-06-25
Bir bash istemi gösteren Linux dizüstü bilgisayar
fatmawati achmad zaenuri/Shutterstock.com

Linux nohup komutu, onları başlatan terminal penceresi kapatıldığında bile önemli işlemlerin çalışmaya devam etmesini sağlar. Bu saygıdeğer komutu bugünün Linux'unda nasıl kullanacağınızı gösteriyoruz.

HUP ve SIGHUP

Linux'un atası olan Unix, PC icat edilmeden önce yaratılmıştı. Bilgisayarlar büyük, pahalı ekipman parçalarıydı. İnsanlar, aynı bina içinde yerel olarak veya yavaş modem bağlantıları üzerinden uzaktan seri hatlar üzerinden onlarla etkileşime girdi. Başlangıçta, talimatlarını yavaş yavaş aptal terminallerle değiştirilen tele yazıcılara yazdılar.

Aptal olarak adlandırıldılar çünkü işlem gücü, yazdığınız terminalde değil, bağlı olduğunuz bilgisayardaydı. Programlar, masanızdaki cihazda değil, bilgisayarda (nerede bulunursa bulunsun) çalışıyordu.

Terminaliniz ve bilgisayar arasındaki bağlantıyı kesen bir şey olursa, bilgisayar hat düşüşünü algıladı ve çalıştırdığınız programlara bir HUP veya kapatma sinyali gönderdi. Programlar, sinyali aldıklarında yürütmeyi durdurdu.

Linux'ta Bir Masaüstü Uygulaması veya Arka Plan İşlemi Nasıl Öldürülür
İLGİLİ Linux'ta Bir Masaüstü Uygulaması veya Arka Plan İşlemi Nasıl Öldürülür

Bu işlevsellik bugün Linux'ta yaşıyor. PC'nizde bir terminal penceresi, fiziksel bir terminalin öykünmesidir. Bu terminal penceresinden başlatılan çalışan işlemleriniz varsa ve bu pencereyi kapatırsanız, programlara SIGHUP sinyali gönderilir, böylece HUP haberdar olurlar ve sonlandırmaları gerektiğini bilirler.

Gerçekleşen bir çağlayan etkisi var. Süreçler herhangi bir alt süreç başlattıysa, SIGHUP, sonlandırmaları gerektiğini bilmeleri için onlara da aktarılır.

nohup komutu, alt süreçleri başlatır ancak onlara SIGHUP sinyallerini iletmeyi reddeder. Bu bir sorun gibi görünebilir, ancak aslında yararlı bir işlevdir.

nohup Komutanlığı

Başlatıldığı terminal penceresi kapalı olsa bile bir işlemin devam etmesini istiyorsanız, programın onu asla almaması için SIGHUP durdurmanın bir yoluna ihtiyacınız vardır. (Aslında, terminal penceresi süreçleri başlatmaz, terminal penceresindeki kabuk oturumu tarafından başlatılırlar.) Bu sorunun basit ve zarif çözümü, kabuk oturumu ile program arasına başka bir işlem yerleştirmek ve buna sahip olmaktır. orta katman programı asla SIGHUP sinyalini iletmez.

nohup yaptığı budur. Programları sizin için başlatır, böylece bunlar kabuğun alt süreci değil, nohup alt süreci olur. Kabuğun bir alt süreci olmadıkları için, doğrudan kabuktan bir SIGHUP almazlar. Ve eğer nohup SIGHUP aktarmazsa, program SIGHUP hiç almaz.

Bu, örneğin, tamamlanmasına izin vermeniz gereken uzun süredir devam eden bir işleminiz olduğunda kullanışlıdır. Terminal penceresini ve kabuğunu yanlışlıkla kapatırsanız, işlemi de sonlandırmış olursunuz. İşlemi başlatmak için nohup kullanmak, işlemi nohup sinyalinden izole eder. SSH üzerinden bir bilgisayarda uzaktan çalışıyorsanız ve uzak bağlantı başarısız olursa hassas bir işlemin sona ermesini istemiyorsanız, işlemi uzak bilgisayarda nohup ile başlatırsınız.

nohup kullanma

Yararlı bir şey yapmayan bir program yarattık, ancak sonlandırılana kadar çalışacak ve çalışacak. Her üç saniyede bir terminal penceresine zamanı yazdırır. “Uzun süreç” için long-proc süreç denir.

 ./uzun-proc 

Bir terminal penceresi çalıştıran uzun süreli program

Bu yararlı bir şey yapan bir program olsaydı ve terminal penceresi ve kabuk kapatılsa bile çalışmaya devam etmesini isteseydik, onu nohup ile başlatırdık.

 nohup ./long-proc 

nohup'tan uzun süreli programı başlatmak

İşlem stdin ve stdout ayrılmıştır, böylece terminal penceresine herhangi bir girdi alamaz veya yazamaz. Ayrıca, hala çalıştığı için komut istemine geri dönmezsiniz. nohup yaptığı tek şey, işlemi terminalin kapanmasına karşı geçirimsiz kılmaktır. Süreci bir arka plan görevine dönüştürmez.

Şimdi işlemi sonlandırmak için yeniden başlatmanız mı gerekiyor? Hayır. Arka plan işlemi olarak başlatmadığınız bir nohup işlemini durdurmak için Ctrl+C tuş bileşimine basın.

Ctrl+C ile uzun süreli süreci durdurma

Programın çıktısı bizim için “nohup.out” adlı bir dosyaya alındı. Daha azıyla gözden geçirebiliriz.

 daha az nohup.out 

nohup.out dosyasını daha az açma

Genellikle terminal penceresine gönderilecek olan her şey dosyada yakalanır. Sonraki nohup çalıştırmaları, mevcut “nohup.out” dosyasına eklenecektir.

Daha az görüntülenen, nohup.out dosyasına yazılan long-proc çıktısı

İşlemi çalıştırmanın daha kullanışlı bir yolu, onu nohup ile başlatmak, böylece terminal penceresinin kapanmasına dayanması ve aynı zamanda bir arka plan görevi yapmasıdır. Bunu yapmak için komut satırının sonuna bir " & " işareti ekliyoruz.

 nohup ./long-proc & 

uzun süreli programı nohup ile başlatmak ve onu bir arka plan görevi yapmak

Komut istemine dönmek için bir kez daha “Enter” tuşuna basmanız gerekecek. İşlemin iş numarasının 1 - parantez " [] " içindeki sayının - ve işlem kimliğinin 13115 olduğu söylendi.

İşlemi sonlandırmak için bunlardan herhangi birini kullanabiliriz. “Ctrl+C” artık çalışmayacak çünkü programın ne terminal penceresiyle ne de kabukla bir ilişkisi yok.

İş numarasının ne olduğunu unutursanız, o terminal penceresinden başlatılan arka plan görevlerini listelemek için jobs komutunu kullanabilirsiniz.

 Meslekler 

Bir terminal penceresinden başlatılan arka plan görevlerini listeleme

Görevimizi sonlandırmak için kill komutunu ve önünde bir yüzde işareti olan " % " iş numarasını aşağıdaki gibi kullanabiliriz:

 %1 öldür

Terminal penceresini kapattıysanız, işlem kimliğini bulmanız ve bunu kill komutuyla kullanmanız gerekir. pgrep komutu, sağladığınız arama ipucuyla eşleşen işlemler için işlem kimliğini bulacaktır. İşlem adını arayacağız.

 pgrep uzun-proc 

Bir işlemin işlem kimliğini ada göre bulma

Artık işlemi sonlandırmak için işlem kimliğini kullanabiliriz.

 13115 öldür 

Bir işlemi sonlandırmak için kill komutunu ve işlem kimliğini kullanma

Bir sonraki “Enter” tuşuna bastığınızda, işlemin sonlandırıldığı konusunda bilgilendirilirsiniz.

Şimdi süreci sonlandırmayan şeye bakalım. Yeniden başlatacağız ve ardından terminal penceresini kapatacağız.

 nohup ./long-proc 

Çalışan bir işlemle terminal penceresini kapatma

Yeni bir terminal penceresi açar ve pgrep ile ararsak hala çalıştığını görürüz. İşlemi başlatan terminal penceresini kapatmanın hiçbir etkisi olmadı.

 pgrep uzun-proc 

Ada göre bir işlem aramak için pgrep kullanma

nohup birden çok komut iletmek mümkündür, ancak genellikle bunları ayrı ayrı başlatmak daha iyidir. Bunları arka plan işleri olarak manipüle etmeyi kolaylaştırır. Komutlar aynı anda çalışmayacak, birbiri ardına yürütülecekler. Yürütme eşzamanlı değil, sıralı. Aynı anda çalıştırmaları için ayrı ayrı başlatmanız gerekir.

Bunu söyledikten sonra, aynı anda birkaç işlemi başlatmak için, bir Bash kabuğu başlatmak için nohup kullanın ve komut dizisiyle -c (komutlar) seçeneğini kullanın. Komut listesini sarmak için tek tırnak işaretleri “ ' ” ve komutları ayırmak için çift ve işareti “ && ” kullanın.

 nohup bash -c 'ls /bin && ls /sbin' 

nohup ile iki işlemi başlatma

"nohup.out" dosyasına bakmak için less kullanırsanız, ilk işlemin çıktısını, ardından ikinci işlemin çıktısını görürsünüz.

 daha az nohup.out 

nohup.out dosyasını daha az açma

Her iki komutun çıktısı “nohup.out” dosyasında tutulmuştur. İç içe değildir, ikinci sürecin çıktısı ancak ilk süreç sona erdiğinde başlar.

nohup.out dosyasının içeriği daha az

“nohup.out” yerine kendinize ait bir dosya kullanmak istiyorsanız, komutu istediğiniz dosyaya yönlendirebilirsiniz.

 nohup bash -c 'ls /bin && ls /sbin' > dosyam.txt 

çıktıyı işlemlerden kullanıcı tarafından sağlanan bir dosyaya yönlendirmek

Mesajın artık "çıktı nohupo.out'a ekleniyor" değil, "stderr stdout'a yönlendiriliyor" yazdığını ve stdout'u "myfile.txt" dosyamıza yönlendirdiğimizi unutmayın.

Daha azıyla “myfile.txt” dosyasının içine bakabiliriz.

 daha az dosyam.txt 

Daha önce olduğu gibi, her iki komutun çıktısını içerir.


Bir yardımcı programın tarihinin bazen onu modern zamanlarla hiçbir ilgisi yokmuş gibi göstermesi komik. nohup komutu bunlardan biridir. Seri hatlardaki bağlantı kesilmeleriyle başa çıkmak için yaratılan bir şey, bugünün Linux kullanıcıları için inanılmaz derecede güçlü makinelerde hala faydalıdır.

İLGİLİ: Bilmeniz Gereken 37 Önemli Linux Komutu