To pytanie jest stare i wciąż nie jestem pewien, dlaczego.
Pierwotne pytanie w 2014 r .:
Uruchomiłem zakładkę Gnome Terminal
$ nohup chromium-browser &
Ale kiedy zamykam kartę terminala, chromium-browser
również wychodzi. Czy nie nohup
powinno temu zapobiec? Gilles powiedział:
Można powiedzieć, że nohup i disown oba tłumią SIGHUP, ale na różne sposoby. nohup powoduje, że program początkowo ignoruje sygnał (program może to zmienić). nohup stara się również zapewnić, że program nie będzie miał terminala sterującego, aby jądro nie wysyłało SIGHUP, gdy terminal jest zamknięty. disown jest czysto wewnętrzny względem powłoki; powoduje, że powłoka nie wysyła SIGHUP po zakończeniu.
Więc czy nohup nie powoduje, że przeglądarka chromowa ignoruje SIGHUP?
Widzę to również w innych plikach wykonywalnych, takich jak i Emacs (tryb GUI). Ale nie na Xeyes.
Dzieje się tak na Ubuntu 12.04, 32-bit, kiedy pytanie zostało opublikowane.
Aktualizacja w 2015 r.,
Teraz korzystam z Ubuntu 14.04, google-chrome
zamiast chromium-browser
zainstalowanego. To samo, co stało się wcześniej z przeglądarką chromu, dzieje się teraz także z Google-Chrome. nohup google-chrome 2>/dev/null &
nie zapisuje go przed zamknięciem, gdy karta terminala jest zamknięta. /usr/bin/google-chrome
to link do skryptu bash /opt/google/chrome/google-chrome
. Dlaczego nohup
zastosowane do skryptu bash nie działa? Jak możemy sprawić, by działał na skryptach bash? Co ze skryptami Python?
xeyes
.Odpowiedzi:
Po zamknięciu okna terminala GNOME SIGHUP jest wysyłany do powłoki, w której był uruchomiony. Powłoka zwykle wysyła SIGHUP do każdej utworzonej grupy procesów - nawet tych, które rozpoczęły
nohup
- a następnie kończy działanie. Jeśli powłoka jestbash
, pominie wysyłanie SIGHUP do dowolnej grupy procesów oznaczonej przez użytkownikadisown
.Uruchomienie polecenia
nohup
powoduje, że ignoruje SIGHUP, ale proces może to zmienić. Jeśli domyślnym ustawieniem jest SIGHUP dla procesu, to jeśli otrzyma SIGHUP, proces zostanie zakończony.Linux zapewnia narzędzia do sprawdzania ustawień sygnału uruchomionego procesu.
Skrypt powłoki przeglądarki chromium wykonuje
exec
skompilowaną aplikację, więc jej identyfikator procesu pozostaje taki sam. Aby zobaczyć ustawienia sygnału, pobiegłem,nohup chromium-browser &
a potem spojrzałem,/proc/$!/status
aby zobaczyć dyspozycję sygnału.To są liczby szesnastkowe. To pokazuje, że SIGHUP nie jest wyłapywany i nie jest ignorowany. Tylko SIGPIPE (13 bit w SigIgn) jest ignorowany. Prześledziłem to do następującego kodu :
Mimo komentarza sygnały ignorowane przez rodzica nie są ignorowane. SIGHUP zabije chrom.
Obejściem tego problemu jest zrobienie tego, na co wskazuje @ xx4h: użyj
disown
polecenia w bashu, aby jeśli bash musiał wyjść, nie wysyła SIGHUP dochromium-browser
grupy procesów. Możesz napisać funkcję, aby to zrobić:źródło
trap "" 1
, spowoduje to, że powłoka (i jej dzieci) zignorują SIGHUP. Wyjaśnię to.trap
polecenia w skrypcie otoki nie zapobiec, a biegnohup
nie może temu zapobiec. Poprawię moją odpowiedź, aby to odzwierciedlić.Jeśli
chromium-browser
coś takiego,google-chrome
to myślę, że najbardziej prawdopodobnym problemem jest to, żechromium-browser
niechromium
jest, ale jest to opakowanie powłoki, które inicjuje stan, a następnieexec
schromium
.W mojej
google-chrome
instalacji plik binarny znajduje się w rzeczywistości,/opt/google/chrome
a opakowanie/usr/bin
jest tylko skryptem powłoki, który konfiguruje wiele środowisk dotyczącychxdg-*
domyślnych i bezwzględnych ścieżek itp. Przed zamianą na binarny właściwy.W tym momencie wszelkie sygnały, które
nohup
początkowo mogły zostać zignorowane w imieniu skryptu, który wywołał jako swoje dziecko, przestaną mieć znaczenie i dopóki skrypt opakowania nie będzie ostrożny, aby ustawić go inaczej (co nie jest), molo zostanie odziedziczone.Spróbuj
file /usr/bin/chromium-browser
sprawdzić, czy to jest skrypt powłoki. Jeśli tak, rozważ przepisanie go, aby lepiej Ci odpowiadało.Mogę powiedzieć, że samo robienie tego
google-chrome 2>/dev/null &
sprawia, że jest dla mnie otwarte, ale nie mogę sobie przypomnieć, czy jest to prawdopodobnie wynik modyfikacji, które wprowadziłem w skrypcie - to było ponad rok temu.źródło
chromium-browser
wcześniej, dzieje się takżegoogle-chrome
teraz. Niechromium-browser
zainstalowałemnohup google-chrome 2>/dev/null &
nie zapisuje go przed zamknięciem, gdy karta terminala jest zamknięta.google-chrome
to skrypt bashowy/opt/google/chrome/google-chrome
. Dlaczego nohup zastosowany do skryptu bash nie działa? Jak możemy sprawić, by działał na skryptach bash? Co ze skryptami Python?chrome
binarny.exec
w rzeczywistościchrome
plik binarny? Jak zatem zmodyfikować skrypt? Oto mój/opt/google/chrome/google-chrome
exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"
... Na górze$HERE
jest ustawiona wartośćreadlink $0
(dla której jest twoja ścieżka instalacjigoogle-chrome
), ale/opt/google/chrome/chrome
jest to plik binarny - tym właśnie skrypt zastępuje się.exec
prawdopodobnie. Skończysz z dodatkowym pidem (ponad 1000 innych) i procesem oczekiwania, ale myślę, że to jest jego zasięg. Albo możesz wymienićexec
w /nohup
może. Wszystko zależy głównie od tegochrome
, co będzie tolerować - ale tak powinno działać.Chrom wydaje się wyjątkowy.
nohup chromium-browser & disown
powinien działać w tym przypadku. Zobacz także: /programming/11421810/nohup-doesnt-work-with-chromiumźródło
nohup chromium-browser &
nie działa