Wiem, że mogę dołączyć &
do polecenia, aby uruchomić proces w tle.
Włączam SSH do skrzynki Ubuntu 12.04 i uruchamiam program python z $python program.py &
- ale kiedy idę do zamykania okna terminala, pojawia się komunikat, że zamknięcie terminalu zabije uruchomiony proces.
Dlaczego to? Używam ampersand, aby uruchomić proces w tle. Jak mogę go uruchomić, niezależnie od tego, czy jestem zalogowany w SSH?
Odpowiedzi:
Po zamknięciu okna terminala emulator terminala wysyła SIGHUP do uruchomionego procesu, czyli powłoki. Twoja powłoka przekazuje następnie SIGHUP do wszystkiego, co działa. W systemie lokalnym jest to ssh. Następnie ssh przekazuje SIGHUP do uruchomionej powłoki, do zdalnej powłoki. Więc twoja zdalna powłoka wysyła następnie SIGHUP do wszystkich swoich procesów, twojego programu działającego w tle.
Są na to dwa sposoby.
disown
polecenia po umieszczeniu procesu w tle. To sprawi, że powłoka o tym zapomni.nohup
(nohup $python program.py &
). Osiąga to to samo, ale przy użyciu procesu pośredniego. Zasadniczo ignoruje sygnał SIGHUP, a następnie rozwidla i wykonuje program, który dziedziczy ustawienia, a następnie kończy działanie. Ponieważ się rozwidlił, uruchamiany program nie jest potomkiem powłoki, a powłoka o tym nie wie. I dopóki nie zainstaluje procedury obsługi sygnału dla SIGHUP, i tak zachowuje akcję ignorowania.logout
zamiast zamykać okno terminala. Kiedy używaszlogout
, nie jest to SIGHUP, więc powłoka nie wyśle SIGHUP do żadnego z jego dzieci.Dodatkowo musisz upewnić się, że twój program nie pisze do terminala przez STDOUT lub STDERR, ponieważ oba z nich nie będą istnieć po wyjściu terminala. Jeśli nie przekierujesz ich do czegoś podobnego
/dev/null
, program nadal będzie działał, ale jeśli spróbuje do nich napisać, dostanie SIGPIPE, a domyślnym działaniem SIGPIPE jest zabicie procesu).źródło
ssh
umieranie powoduje zerwanie połączenia, połączenie zrzucenie powodujesshd
śmierć drugiego końca. Ten sshd kontrolujący stronę główną pseudo-terminala, który uruchamia zdalna powłoka, gdy umiera, jest to rozłączenie (to jest jak wyciągnięcie wtyczki z prawdziwego terminala), więc system wysyła SIGHUP do zdalnej powłoki.nohup
generujenohup.out
plik z wyjściem programu, który na nim zaczynasz. Usunięcie tego pliku może być denerwujące za każdym razem, gdy użyjesz nohup do uruchomienia aplikacji w ten sposób (lub będziesz musiał przekierować jego dane wyjściowe/dev/null
).nohup python program.py &
polecam użyciesetsid python program.py
zamiast tego, co natychmiast odrzuca program.Proces działa w tle w terminalu, ale dane wyjściowe z
stdout
(istderr
) są nadal wysyłane do terminala. Aby temu zapobiec, dodaj> /dev/null 2>&1
przed,&
aby przekierować oba wyjścia do/dev/null
- dodaniedisown
również upewnia się, że proces nie zostanie zabity po zamknięciu terminala:W twoim przypadku byłoby to:
źródło
Te
&
polecenia operatora oddziela się równolegle, jak;
polecenia oddziela uruchomić szeregowo. Oba rodzaje poleceń będą nadal działać jako proces potomny procesu powłoki .Tak więc, kiedy zamkniesz powłokę, która zapoczątkowała te dzieci, one również zostaną zamknięte.
Wydaje się, że chcesz procesu demona , który jest znacznie trudniejszy, ponieważ musi całkowicie oddzielić się od procesu nadrzędnego. Powłoka zwykle nie ma na to prostego sposobu.
źródło
Po wylogowaniu procesy w tle związane z sesją logowania są zwykle zabijane. Jeśli chcesz, aby były odłączone od sesji, uruchom je za pomocą
nohup
.źródło
Po poleceniu kończącym się na ampersand (
&
) w wierszu polecenia uruchom poleceniebg
:Spowoduje to umieszczenie polecenia „&” w tle
Spowoduje to wyświetlenie zadań uruchomionych w tle
Spowoduje to przeniesienie zadania nr 1 na pierwszy plan
Innym sposobem (aby się wylogować)
at
Polecenie może zawierać wiele wierszy , zanim ^ d (Control-D)patrz
man at
.źródło