Linux'ta nohup Komutu Nasıl Kullanılır
Yayınlanan: 2022-06-25 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.
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
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
İş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.
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
Genellikle terminal penceresine gönderilecek olan her şey dosyada yakalanır. Sonraki nohup
çalıştırmaları, mevcut “nohup.out” dosyasına eklenecektir.
İş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 &
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
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
Artık işlemi sonlandırmak için işlem kimliğini kullanabiliriz.
13115 öldür
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
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
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.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
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” yerine kendinize ait bir dosya kullanmak istiyorsanız, komutu istediğiniz dosyaya yönlendirebilirsiniz.
nohup bash -c 'ls /bin && ls /sbin' > dosyam.txt
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