Kabuktan çıkıldığında veya öldürüldüğünde arka plandaki bir işin öldürülüp öldürülmediğini tam olarak ne belirler?


12

Bu soru geldi oldukça bir sürü ( gerçekten çok ), ama cevaplar genellikle eksik olması buluyorum. Genel soru şudur: "ssh'den çıkıp öldürdüğümde işim neden öldürülüyor / öldürülmüyor?" İlk soru şudur: Aşağıdaki bilgiler ne kadar geneldir? Aşağıdaki modern Debian linux için doğru gibi görünüyor, ama bazı bit eksik; ve başkalarının neleri bilmesi gerekir?

  1. Ssh bağlantısı kapatıldığında veya bir SSH bağlantısı üzerinden açılan bir kabuğun arka plana Tüm alt işlemler, SIGHUP ile öldürülür yalnızcahuponexit çalıştırın: seçenek ayarlandığında shopt huponexitbu doğru olup olmadığını görmek için.

  2. Eğer huponexitdoğruysa, o zaman kullanabilir nohupya disownsen çıktığınızda o öldürdü almaz böylece kabuğundan sürecini ayrışmasına sebep olmaktadır. Veya, bir şeylerle koşun screen.

  3. Eğer huponexitki, yanlıştır varsayılan bazı bugünlerde linux'lar en azından, sonra arka plana işler olacak değil , normal çıkış yapınca öldürülebilir.

  4. Ancakhuponexit yanlış olsa bile , ssh bağlantısı öldürülürse veya düşerse (normal oturumdan farklıysa), arka plandaki işlemler yine de öldürülür. Bu, (2) 'de disownya nohupda (2)' de olduğu gibi önlenebilir .

  5. (A) Ana işlemi terminal olan işlemler ile (b) terminale stdin, stdout veya stderr bağlı işlemler arasında bazı ayrımlar vardır . (A) ve (b) değil ya da tam tersi süreçlere ne olduğunu bilmiyorum.

Son soru: Davranıştan nasıl kaçınabilirim (3)? Başka bir deyişle, Debian'da varsayılan olarak arka plandaki işlemler çıkıştan sonra kendiliğinden çalışırlar, ancak ssh bağlantısı kesildikten sonra değil. Bağlantının normal bir şekilde kapatılıp kapatılmadığından veya öldürülmesine bakılmaksızın aynı şeylerin süreçlerde olmasını istiyorum. Yoksa bu kötü bir fikir mi?

Düzenleme: Öldürme iş tutmak için başka bir önemli yol, her iki durumda da çalışır (?) Onları ekran üzerinden çalıştırmaktır . Ancak, soru daha çok şeylerin ne zaman öldürüldüğünü ve ne zaman öldürülmediklerini anlamakla ilgilidir: bazen insanlar işlerin çıkışta öldürülmesini isterler.

Daha fazla konu: - Sinyaller (iç çekme), işler ve kontrol terminali hakkında açıklama - /server/117152/do-background-processes-get-a-sighup-when-logging-off - SSH'ye devam et SSH kapatılırken arka plan görevi / işleri - Bir SSH oturumu kapatıldıktan sonra arka plana yerleştirilen bir iş çalışmaya devam edecek mi? - SSH istemcisini kapattıktan sonra zaten çalışan bir arka plan işleminin durdurulmasını önleme - Bağlantıyı kestikten sonra çalışmaya devam edecek şekilde SSH üzerinden bir işlemi nasıl başlatabilirim? - OS X'de uzaktan iş çalıştırılamıyor - SSH bağlantısını kapat

Yanıtlar:


1

Bir süreç "SIGHUP ile öldürülmez" - en azından kelimenin tam anlamıyla değil. Aksine, bağlantı kesildiğinde, terminalin kontrol işlemine (bu durumda Bash), genellikle "HUP sinyali" veya sadece SIGHUP olarak kısaltılan bir kapatma sinyali * gönderilir.

Şimdi, bir işlem bir sinyal aldığında, onu istediği gibi işleyebilir **. Çoğu sinyal için varsayılan (HUP dahil) hemen çıkmaktır. Bununla birlikte, program bunun yerine sinyali görmezden gelmekte, hatta bir tür sinyal işleyici işlevini çalıştırmakta serbesttir.

Bash son seçeneği seçer. HUP sinyal işleyicisi "huponexit" seçeneğinin doğru olup olmadığını kontrol eder ve eğer öyleyse, alt işlemlerinin her birine SIGHUP gönderir. Sadece bununla bitince Bash çıkar.

Benzer şekilde, her alt süreç sinyali aldığında istediği her şeyi yapmakta serbesttir: varsayılana ayarlı olarak bırakın (yani hemen ölün), yok sayın veya bir sinyal işleyici çalıştırın.

Nohup, alt işlemin varsayılan eylemini yalnızca "yoksay" olarak değiştirir. Bununla birlikte, alt süreç çalıştıktan sonra, sinyale kendi yanıtını değiştirmek ücretsizdir.

Bu, bence, onları nohup ile çalıştırsanız bile bazı programlar ölüyor:

  1. Nohup varsayılan eylemi "yoksay" olarak ayarlar.
  2. Program, çıkarken bir tür temizleme işlemi yapmalıdır, bu nedenle "Yoksay" bayrağının üzerine yazarak bir SIGHUP işleyicisi yükler.
  3. SIGHUP geldiğinde, işleyici çalışır, programın veri dosyalarını (veya yapılması gerekeni) temizler ve programdan çıkar.
  4. Kullanıcı işleyiciyi veya temizlemeyi bilmiyor veya önemsemiyor ve programın nohup'a rağmen çıktığını görüyor.

Burada "reddedilme" devreye girer. Bash tarafından reddedilen bir işleme, huponexit seçeneğinden bağımsız olarak hiçbir zaman HUP sinyali gönderilmez. Dolayısıyla, program kendi sinyal işleyicisini ayarlasa bile, sinyal hiçbir zaman gerçekte gönderilmez, böylece işleyici hiçbir zaman çalışmaz. Bununla birlikte, program oturumu kapatmış bir kullanıcıya bazı metinler göstermeye çalışırsa, programın yine de çıkmasına neden olabilecek bir G / Ç hatasına neden olacağını unutmayın.

* Ve evet, sormadan önce, "kapat" terminolojisi UNIX'in çevirmeli ana bilgisayar günlerinden çıkarılmıştır.

** Zaten çoğu sinyal. Örneğin SIGKILL, programın her zaman derhal sona ermesine neden olur.


2

Nokta 1-4 doğru. Nokta 5 hakkında hiçbir şey bilmiyorum. Son noktanıza gelince, ince bir uygulama ekranı , bağlantınızı nasıl sonlandırdığınızdan bağımsız olarak tüm süreçlerin doğal sonlarına ulaşmasına izin verecektir. Ekran depolardadır.

Ekranın insan tanımını okumak kolay değil, ama diğer şeylerin yanı sıra şunları söylüyor:

Ekran çağrıldığında, içinde bir kabuk (veya belirtilen komut) bulunan tek bir pencere oluşturur ve sonra normalde yaptığınız gibi programı kullanabilmeniz için yolunuzdan çıkar. Ardından, istediğiniz zaman diğer programlarla (daha fazla kabuk dahil) yeni (tam ekran) pencereler oluşturabilir, mevcut pencereleri öldürebilir, bir pencere listesini görüntüleyebilir, çıkış günlüğünü açabilir ve kapatabilir, metni kopyalayıp yapıştırabilirsiniz pencereler arasında, kaydırma geçmişini görüntüleyin, pencereler arasında istediğiniz şekilde geçiş yapın, vb. Tüm pencereler programlarını birbirinden tamamen bağımsız olarak çalıştırır. Programlar, pencereleri şu anda görünür olmadığında ve tüm ekran oturumu kullanıcının terminalinden ayrılsa bile çalışmaya devam eder. Bir program sona erdiğinde, ekran (varsayılan olarak) onu içeren pencereyi öldürür. Bu pencere ön plandaysa, ekran önceki pencereye geçer; hiçbiri bırakılmazsa ekrandan çıkar.

En önemli kısmı vurguladım: Ctrl + a + d komutuyla pencereyi ayırabilirsiniz ve daha sonra oturumunuzu öldürebilir / oturumu kapatabilirsiniz ve şimdi ayrılan pencere, içerideki programlar hala çalışıyorken yaşamaya devam edecektir. Tekrar bağlandığınızda, örneğin yeni bir ssh oturumu başlatarak, -r komut ekranı , daha önce ayrılmış olan ekran oturumuna devam eder ve tüm standart hata / çıktı çıktıları açıkça görülebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.