Nohup'a rağmen terminali kapattığımda krom tarayıcı neden öldürüldü?


12

Bu soru eski ve hala neden olduğu konusunda net değilim.


2014 yılında orijinal soru:

Bir Gnome Terminali sekmesinde koştum

$ nohup chromium-browser &

Ancak terminal sekmesini kapattığımda chromium-browserda çıkar. Değil mi nohupbunu önlemek gerekiyordu? Gilles şöyle dedi:

nohup ve disown, SIGHUP'u bastırdığı söylenebilir, ancak farklı şekillerde. nohup, programın başlangıçta sinyali yoksaymasını sağlar (program bunu değiştirebilir). nohup ayrıca programın bir kontrol terminaline sahip olmamasını ayarlamaya çalışır, böylece terminal kapatıldığında çekirdek tarafından SIGHUP gönderilmez. reddetme tamamen kabuğun içindedir; kabuk sona erdiğinde SIGHUP göndermemesine neden olur.

Peki nohup krom tarayıcı SIGHUP'u yok saymıyor mu?

Bunu Emacs (GUI modu) gibi diğer yürütülebilir dosyalarda da görüyorum. Ama xeyes üzerinde değil.

Bu soru gönderildiğinde 32-bit Ubuntu 12.04'te oluyor.


2015 yılında güncelleme,

Şimdi kurulu google-chromeyerine Ubuntu 14.04 kullanıyorum chromium-browser. Daha önce krom tarayıcıda olanlarla aynı şey şimdi google-chrome'da da oluyor. nohup google-chrome 2>/dev/null &terminal sekmesi kapalıyken kapatılmasını engellemez. /usr/bin/google-chromebir bash betiğinin bağlantısıdır /opt/google/chrome/google-chrome. nohupBash komut dosyasına uygulanan neden çalışmıyor ? Bunu bash betiklerinde nasıl çalıştırabiliriz? Python betikleri ne olacak?


1
Ortamınız hakkında daha fazla bilgi vermelisiniz. Test vakanýzý yeniden yaratmam.
jlliagre

Bunu başka hangi yürütülebilir dosyalar ile görüyorsunuz? Örneğin, basit bir şey deneyin xeyes.
Warren Young

@ WarrenYoung: Emacs (GUI). Ama xeyes çalışıyor.
Tim

Yanıtlar:


12

Bir GNOME Terminal penceresini kapattığınızda, çalıştırdığı kabuğa bir SIGHUP gönderilir. Kabuk, oluşturduğunu bildiği her işlem grubuna - hatta başladığında bile - bir SIGHUP gönderir nohupve sonra çıkar. Kabuk ise bash, bu kullanıcı ile işaretlenmiş herhangi süreç grubuna bir SIGHUP gönderme atlayacak disown.

Bir komutun çalıştırılması nohupSIGHUP'u yoksaymasına neden olur, ancak işlem bunu değiştirebilir. SIGHUP'un bir işlem için atılması varsayılan olduğunda, bir SIGHUP alırsa işlem sonlandırılır.

Linux, çalışan bir işlemin sinyal ayarlarını incelemek için bazı araçlar sağlar.

Krom tarayıcı kabuk komut dosyası execderlenmiş uygulamadan birini yapar, bu nedenle işlem kimliği aynı kalır. Sinyal ayarlarını görmek için koştum nohup chromium-browser &ve sonra /proc/$!/statussinyal yerleşimini görmek için baktım .

SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180014003

Bunlar onaltılık sayılar. Bu, SIGHUP'un yakalanmadığını ve yok sayılmadığını gösterir. Yalnızca SIGPIPE (SigIgn'ta 13. bit) yoksayılır. Ben aşağıdaki kodu izledi :

// Setup signal-handling state: resanitize most signals, ignore SIGPIPE.
void SetupSignalHandlers() {
  // Sanitise our signal handling state. Signals that were ignored by our
  // parent will also be ignored by us. We also inherit our parent's sigmask.
  sigset_t empty_signal_set;
  CHECK(0 == sigemptyset(&empty_signal_set));
  CHECK(0 == sigprocmask(SIG_SETMASK, &empty_signal_set, NULL));

  struct sigaction sigact;
  memset(&sigact, 0, sizeof(sigact));
  sigact.sa_handler = SIG_DFL;
  static const int signals_to_reset[] =
      {SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV,
       SIGALRM, SIGTERM, SIGCHLD, SIGBUS, SIGTRAP};  // SIGPIPE is set below.
  for (unsigned i = 0; i < arraysize(signals_to_reset); i++) {
    CHECK(0 == sigaction(signals_to_reset[i], &sigact, NULL));
  }

  // Always ignore SIGPIPE.  We check the return value of write().
  CHECK(signal(SIGPIPE, SIG_IGN) != SIG_ERR);
}

Yoruma rağmen, ebeveyn tarafından göz ardı edilen sinyaller göz ardı edilmemektedir . SIGHUP kromu öldürecektir.

Geçici çözüm @ xx4h'nin işaret ettiği şeyi yapmaktır: bash'dan disownçıkmak zorundaysa, bash çıkmak zorundaysa, chromium-browserişlem grubuna SIGHUP göndermez . Bunu yapmak için bir işlev yazabilirsiniz:

mychromium () { /usr/bin/chromium-browser & disown $!; }

Teşekkürler. Şimdi çoğunlukla ne demek istediğinizi anlamaya geliyorum. "Komut dosyası bu tuzağı hiç sıfırlamadığından, gerçek krom ikilisi SIGHUP'un düzeni varsayılan olarak ayarlanmış olarak çağrılır." "Bu tuzağı sıfırla" ile, SIGHUP tuzağını varsayılana döndürmek istiyor musunuz, bu işlemi sonlandırıyor mu? "Bu tuzağı nasıl sıfırlarsınız?"
Tim

"Bu tuzağı sıfırla" ile, "bu sinyalin düzenini, kabuk betiği bunun için bir işleyici ayarlamadan önceki haline geri döndürmek" anlamına geliyordu. Kabuk trap "" 1olsaydı, kabuk (ve çocukları) SIGHUP'u görmezden gelirdi. Bunu açıklığa kavuşturacağım.
Mark Plotnick

Teşekkürler. Açıklamanızdan sonra kontrol edecektir. Şimdi daemon, nohup, disown ve arka planı anlamaya çalışıyorum, bu yüzden eski sorularımı ve anlamadığım cevapları tekrar ziyaret etmek için geri döndüm. Nohup, reddedilme ve arka planla ilgili karışıklıklar çoğunlukla çözüldü ve ben daemon kavramı ve bir sürecin nasıl daemonize edileceği konusunda sıkıştım (aşağıya bakınız). Tekrar yardım etmek için zamanınız varsa tekrar teşekkür ederim.
Tim


Krom uygulama koduna baktım ve uygulamada C ++ kodu SIGHUP'ı koşulsuz olarak varsayılana sıfırlar. trapBunu önlemek ve çalışan yok sarıcı kabuk komut komutlar nohupbu engelleyemez. Bunu yansıtmak için cevabımı gözden geçireceğim.
Mark Plotnick

2

Eğer chromium-browserböyle bir şey varsa google-chromeo zaman en olası sorun chromium-browser değilchromium ama onun yerine devlet execs başlatan bir kabuk sarıcı olduğunu düşünüyorum chromium.

Benim google-chromekurulumda ikili aslında yer alır /opt/google/chromeve sarıcı /usr/binsadece xdg-*kendisini uygun ikili ile değiştirmeden önce varsayılanlar ve mutlak yollar ve benzeri ile ilgili bir çok ortam kurar bir kabuk komut dosyasıdır .

Bu noktada nohup, çocuğu olarak adlandırdığı komut dosyası adına başlangıçta yoksaymış olabilecek sinyaller önemsizleşir ve sarmalayıcı komut dosyası başka türlü düzenlemeye dikkat etmediği sürece (o değil) ctty devralınır.

file /usr/bin/chromium-browserBence kabuk-script olup olmadığını kontrol etmeye çalışın . Öyleyse, size daha uygun olması için yeniden yazmayı düşünün.

Sadece yapmanın google-chrome 2>/dev/null &benim için açık tuttuğunu söyleyebilirim , ancak bunun senaryoda yaptığım değişikliklerin olası bir sonucu olup olmadığını hatırlayamıyorum - bir yıldan uzun bir süre önceydi.


Teşekkürler. Daha chromium-browserönce de aynı şey oldu google-chrome. Ben sahip olmayan chromium-browseryüklenmiş. nohup google-chrome 2>/dev/null &terminal sekmesi kapalıyken kapatılmasını engellemez. google-chromebir bash betiğidir /opt/google/chrome/google-chrome. Bir bash betiğine uygulanan nohup neden çalışmıyor? Bunu bash betiklerinde nasıl çalıştırabiliriz? Python betikleri ne olacak?
Tim

Eh, o does senaryo üzerinde çalışması, ama senaryo yalnızca gerçek yerini önce birkaç nano saniye yayınlanır chromeikili.
mikeserv

Senaryoda execaslında chromeikili var mı diyorsun? Komut dosyasını nasıl değiştiririm? İşte benim/opt/google/chrome/google-chrome
Tim

@ Zaman - evet - alt kısmı görüyor musunuz? exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"... Üstte (kurulum yolunuz için )$HERE değerine ayarlanır ancak ikili - betiğin kendisi ile değiştirildiği şeydir. readlink $0 google-chrome/opt/google/chrome/chrome
mikeserv

@Tim: Bildiğim kadarıyla olarak nasıl gider - sadece bırakın execmuhtemelen. Ekstra bir pid (1000 diğerlerinin ötesinde) ve bekleyen bir kabuk işlemi ile dolacaksınız, ancak bunun kapsamı olduğunu düşünüyorum. Ya da belki execw ile değiştirebilirsiniz nohup. Her şey çoğunlukla neyi chrometolere edeceğine bağlıdır - ancak böyle çalışmalıdır.
mikeserv

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.