Powiedzmy, że uruchamiam kilka procesów z sesji ssh. Czy można zakończyć sesję ssh, utrzymując procesy uruchomione na zdalnym komputerze?
Powiedzmy, że uruchamiam kilka procesów z sesji ssh. Czy można zakończyć sesję ssh, utrzymując procesy uruchomione na zdalnym komputerze?
Odpowiedzi:
Powinieneś poszukać nowoczesnych alternatyw, takich jak tmux
.
tmux
jest lepszy screen
od wielu powodów, oto tylko kilka przykładów:
Aby uzyskać taką samą funkcjonalność, jak wyjaśniono w odpowiedzi na zalecenie screen
, należy wykonać następujące czynności:
tmux
od wpisania tmux
do powłokitmux
sesjitmux
sesję, wpisując Ctrl+, ba następnied Możesz teraz bezpiecznie wylogować się ze zdalnego komputera, proces będzie nadal działał w środku tmux
. Gdy wrócisz ponownie i chcesz sprawdzić status swojego procesu, możesz użyć go tmux attach
do dołączenia do tmux
sesji.
Jeśli chcesz mieć wiele sesji działających obok siebie, powinieneś nazwać każdą sesję za pomocą Ctrl+ bi $
. Możesz uzyskać listę aktualnie uruchomionych sesji za pomocą tmux list-sessions
, teraz dołącz do uruchomionej sesji za pomocą polecenia tmux attach-session -t 0
.
tmux
potrafi robić znacznie bardziej zaawansowane rzeczy niż obsługa pojedynczego okna w jednej sesji. Aby uzyskać więcej informacji, zajrzyj na stronę GitHubman tmux
lub tmux . W szczególności tutaj jest FAQ na temat głównych różnic między screen
i tmux
.
screen -x -r [screenname]
lub screen -rx
w skrócie, jeśli masz tylko jedną sesję ekranu. Umożliwia to dołączenie istniejącej instancji ekranu.
Ctrl-b
a następnie d
opuścić / odłączyć tmux
sesję. Z pewnością tak jest w przypadku wersji tmux
na moim Ubuntu 12.04.
tmux detach
zamiast pisaćctrl-b d
nohup
Najlepszy sposób jest często najprostszy.
nohup long-running-command &
Został stworzony specjalnie do tego, nawet loguje standardowe wyjście nohup.log
.
man nohup
bg
Jeśli chcesz „uruchomić” niektóre już uruchomione zadania, najlepszym rozwiązaniem jest Ctrl+, Za następnie uruchomienie
bg
aby umieścić ostatnie zawieszone zadanie w tle, umożliwiając mu kontynuowanie działania.
W takim razie szybki disown
powinien kontynuować proces po wylogowaniu.
screen
i inni mogą to zrobić, ale nie po to są. Polecam nohup
dla zadań, o których wiesz, że zamierzasz zostawić za sobą, a także bg
dla zadań, które już uruchomiłeś i nie chcesz ponownie zaczynać.
Pamiętaj, że oba są specyficzne dla bash. Jeśli nie używasz bash, polecenia mogą być inne.
disown -h
bg
+ disown
nie działało dla mnie. Miałem uruchomiony skrypt wdrażania. Zapomniałem uruchomić w tmuxie i musiałem wcześniej wyjść na spotkanie. Skrypt nieprzerwanie wysyła informacje o postępie do powłoki. ctrl+z
zatrzymał proces, przywracając mnie do szału. bg
wznowił proces, ale wznowił także wysyłanie stanu do bash, uniemożliwiając zobaczenie, co piszę. Jednak disown
polecenie wywołało „disown: current: no such job”
julia myFile.jl
jakiegokolwiek powodu. Tmux działa i jest świetny.
Możesz to zrobić za pomocą screen
.
Wpisz, man screen
aby dowiedzieć się więcej lub przeczytaj tę stronę podręcznika użytkownika .
Prosty scenariusz:
ssh do twojego zdalnego urządzenia. Wpisz screen
Następnie uruchom żądany proces.
Naciśnij Ctrl- Anastępnie Ctrl- D. Spowoduje to „odłączenie” sesji ekranu, ale pozostawi procesy uruchomione. Możesz teraz wylogować się ze zdalnego skrzynki.
Jeśli chcesz wrócić później, zaloguj się ponownie i wpisz. screen -r
To „wznowi” sesję ekranu i zobaczysz wynik swojego procesu.
screen -S name
aby ułatwić późniejsze połączenie z właściwą.
screen -S
przed wyjazdem i screen -r
po powrocie jest niesamowite!
Screen and nohup to lepszy sposób, ale jeśli musisz odłączyć proces, który już działa bez screena lub nohup, możesz uruchomić polecenie disown.
disown [-ar] [-h] [
jobspec
… |
pid
… ]
Bez opcji usuń każdy typ zadania z tabeli aktywnych zadań. Jeśli
-h
podano opcję, zadanie nie jest usuwane z tabeli, ale jest oznaczane, aby SIGHUP nie był wysyłany do zadania, jeśli powłoka otrzyma SIGHUP. Jeśli specyfikacja zadania nie jest dostępna i nie podano-a
ani-r
opcji ani , wówczas używane jest bieżące zadanie. Jeśli nie podano specyfikacji zadania ,-a
opcja oznacza usunięcie lub zaznaczenie wszystkich zadań;-r
opcja bez jobspec argumentu ogranicza działanie z prowadzeniem pracy.
Za pomocą disown możesz zamknąć terminal i uruchomić proces na komputerze.
disown -a && exit
disown
i to go zabiło.
Utknąłem w dużym mv, więc nie byłem w stanie zatrzymać procesu, ekranu konfiguracji, a następnie uruchomić go ponownie. Udało mi się wyjść z sesji ssh z uruchomionym procesem, wykonując zasadniczo następujące czynności:
Krok 3 wstrzymuje bieżący proces (np. Moje polecenie „mv”).
Krok 4 umieszcza wstrzymany proces w tle i wznawia go.
Krok 5 pozwala odrzucić proces. ** Aby uzyskać listę zadań, po prostu wpisz jobs
wcześniej.
** Jeśli chodzi o disown (z podręcznika bash):
disown [-ar] [-h] [jobspec ... | pid ... ]
Without options, remove each jobspec from the table of active
jobs. If jobspec is not present, and neither the -a nor the -r
option is supplied, the current job is used. If the -h option
is given, each jobspec is not removed from the table, but is
marked so that SIGHUP is not sent to the job if the shell
receives a SIGHUP. If no jobspec is supplied, the -a option
means to remove or mark all jobs; the -r option without a job‐
spec argument restricts operation to running jobs. The return
value is 0 unless a jobspec does not specify a valid job.
disown
wbudowane polecenie działa na ostatnie zadanie w tle.
Istnieją dwa główne programy, których można używać do utrzymywania programów i stanu terminala przez wiele połączeń ssh. Są one ekranowe (zasiedziałe, ale niestety nieobsługiwane. Najwyraźniej są teraz aktywnie rozwijane ) i tmux (nowsze, aktywnie utrzymywane). Byobu to interfejs, który może działać na swoich systemach i zapewnia dodatkowe informacje o stanie Ubuntu. W nowych instalacjach użyje tmux jako backendu, jeśli masz starszą instalację byobu i istniejącą konfigurację, zachowa poprzedni backend, czy to screen czy tmux.
Byobu można zainstalować na komputerze, robiąc to na maszynie opartej na Debianie:
sudo aptitude install byobu
Używając mniam, robisz
su -c 'yum install byobu'
Możliwe jest również zainstalowanie byobu w innych dystrybucjach.
Możesz uruchomić byobu, uruchamiając byobu
się na hoście po połączeniu za pomocą ssh. To da ci powłokę, która wygląda następująco:
Możesz także używać Byobu Terminal na komputerze Ubuntu z opcją -X i łatwo mieć doskonale działające byobu.
Zacznij byobu, pisząc byobu
.
Możesz nacisnąć F2, aby utworzyć nowe okno w ramach bieżącej sesji, F3-F4, aby przełączać się między różnymi oknami.
Najlepsze w byobu jest to, że nie musisz zabijać procesów uruchomionych w terminalu, aby opuścić terminal. Możesz po prostu wysłać screen / tmux (szkielet byobu) do tła i wznowić następnym razem:
Następnym razem, kiedy przyjdziesz, po prostu byobu
idź i powróć tam, gdzie byłeś.
Możesz także tworzyć różne sesje Byobu przez byobu -S session1
i tak dalej. Po powrocie możesz połączyć się z jednym z nich.
Możesz zrobić znacznie więcej, używając Byobu. Użyj tego! Niektóre ostateczne przewodniki są tutaj lub tutaj .
Nie możesz tego zrobić po rozpoczęciu procesu, musisz skonfigurować rzeczy przed uruchomieniem długiego zadania.
Możesz używać nohup, ale współczesna mądrość sugeruje używanie screena lub byobu jako loginu, abyś mógł odłączyć i pozostawić sprawy uruchomione.
Zaletą ekranu jest to, że można odłączyć od jednego komputera i podłączyć go ponownie do drugiego, co jest przydatne, jeśli chcesz sprawdzić procesy działające długo po zakończeniu dnia roboczego.
Tutaj znajduje się uzasadniony przewodnik dla początkujących .
byobu umieszcza łatwy w użyciu interfejs na górze ekranu z menu itp. Jest to również bieżąca implementacja screena na nowszym Ubuntu. F2, aby uruchomić nowy terminal F3 / F4, aby przełączać się tam iz powrotem, a F6, aby się rozłączyć. Wpisz polecenie exit, aby faktycznie zakończyć terminale na stałe.
disown
. Zobacz odpowiedź @ bassgey
disown
a w razie potrzeby wystarczy Ctrl-z
, bg
aby pobrać go z aktywnego terminala i w tle. Potem disown
.
Hej, podczas gdy zgodziłem się, że ekran jest najbardziej efektywną opcją. Możesz użyć vncserver, a następnie rozpocząć na nim proces.
Również jeśli twoim jedynym interesem jest uruchomienie procesu i nie musisz go przejmować, a co najważniejsze, nie byłeś świadomy, że będziesz musiał zamknąć sesję i proces już działa, nie będziesz miał szczęścia, jeśli użyłeś bash jako powłoki
Najpierw musisz wysłać proces do tła, naciskając Ctrl + Z, a następnie bg% 1 (liczba zależy od numeru zadania, zwykle jest to 1, ale możesz łatwo wyciągnąć listę za pomocą zadań poleceń)
Na koniec wywołaj polecenie disown (po którym następuje jobid ... tak samo jak w przypadku polecenia bg)
Spowoduje to usunięcie relacji rodzic-dziecko między powłoką a procesem działającym w tle, zapobiegając jej śmierci po zakończeniu działania powłoki.
screen
, zadawano pytanie po zalogowaniu, jak utrzymać procesy uruchomione, teraz po zalogowaniu, ale przed ich uruchomieniem. Świetna odpowiedź Jorge, naprawdę mi pomogłeś! :)
bg
(bez %1
) często wystarcza, ponieważ domyślną jest bieżąca praca
W przypadku pojedynczego skryptu powłoki, który mam uruchomiony przez długi czas, zaloguję się i uruchomię proces w tle za pomocą „&”.
Przykład:
/path/to/my/script &
Wylogowałem się i rozłączyłem sesję SSH. Kiedy loguję się jakiś czas później, skrypt nadal działa, co potwierdza ciągłe zbieranie danych ze skryptu.
&
wylogowania i zalogowania się do sesji SSH, proces będzie nadal działał, jednak nie będziesz w stanie zobaczyć wyniku tego procesu (jeśli twój skrypt powtórzył coś nie zobaczy go, ale jeśli zapisze plik, plik będzie tam)
Powinieneś sprawdzić ekran GNU i sprawdzić, czy ci to pomoże. W zależności od tego, jak chcesz, aby aplikacja działała w czasie rzeczywistym, może powodować więcej problemów niż rozwiązuje, ale przynajmniej pozwoli ci wznowić sesję tak, jakbyś jej nigdy nie opuszczał.
Jak używać :
screen
do pierwszego uruchomienia, przewiń komunikaty wprowadzające, powinieneś otrzymać terminal.screen -r
aby wznowić tę sesję. Możesz mieć kilka oddzielnych sesji ekranowych jednocześnie, w tym przypadku wyświetli się lista dostępnych sesji.Istnieje wiele innych opcji, na przykład podzielone ekrany, a także wszystkie skróty można w pełni dostosować.
Najprostsza odpowiedź ...
ctrl + z zawiesi uruchomiony program
„bg” uruchomi go w tle
disown
lub nohup
), zwykle nie spowoduje to kontynuacji procesu po zakończeniu sesji SSH.
Podczas gdy wszyscy mówią, aby użyć disown
(jedyna opcja, którą masz po rozpoczęciu procesu), nohup
lub nawet uruchomienie polecenia screen
, co jest przydatne, jeśli chcesz zobaczyć wszystkie dane wyjściowe polecenia ... Jestem fanem screen
.. Nadal próbowałem najnowszych dystrybucji Linuksa w głównym nurcie i po prostu umieszczenie zadania w tle i zakończenie pracy nie powoduje śmierci wszystkich uruchomionych procesów. Musi istnieć globalne ustawienie lub coś takiego. Próbuję tego na niektórych dość starych systemach (slackware 12) i mój skrypt testowy działa, dopóki go ręcznie nie zabiję:
shell$ cat > test.pl
#!/usr/bin/perl
while(1){
sleep(1);
}
shell$ perl ./test.pl &
shell$ exit
logout
shell$ ps aux test.pl
mymom 31337 1 0 13:25 ? 00:00:00 perl ./test.pl
shell$
Chociaż zgadzam się, że screen
byłby to najlepszy sposób na uruchomienie tego, nawet jeśli mój skrypt napisał do plików dziennika itp. Nigdy nie musiałem z niego korzystać disown -a
lub nohup
chyba, że nie był to kompletna paranoja. Może ktoś może rzucić nieco światła na to, jak domyślnie zachowuje się bash? Może niektórzy administratorzy systemu zmieniają ustawienia domyślne dużych powłok, aby procesy użytkowników nie były przeciążone?
Niestety zakończona sesja SSH może spowodować śmierć Tmux lub screena. Wynika to z faktu, systemd
że wszelkie procesy potomne zostaną zakończone po wylogowaniu z sesji.
Możesz zmienić to ustawienie w swoim logind.conf
( /etc/systemd/logind.conf
):
KillUserProcesses=no
Dzięki odpowiedzi w https://unix.stackexchange.com/questions/490267 .
Zamiast :
cmd options;
Dodaj przed nohup
:
nohup cmd options &
Następnie zobaczysz standardowe wyjście konsoli:
tail -f nohup.out