Jak odzyskać powłokę po rozłączeniu


37

Robię trochę pracy na zdalnym komputerze CentOS 5.6, a moja sieć wciąż spada. Czy istnieje sposób na odzyskanie zawieszonych sesji po ponownym połączeniu?

EDYCJA: robię trochę aktualizacji i instalacji z yum i martwię się, że może to być problem, jeśli procesy będą się zawieszać w środku tego, co robią.


6
tmux lub screen.
sehe

Odpowiedzi:


63

Nie ma mowy, ale aby temu zapobiec, lubię używać tmux. Zaczynam tmux, zaczynam operację i idę swoją drogą. Jeśli wrócę i stwierdzę, że połączenie zostało zerwane, wszystko, co muszę zrobić, to połączyć się ponownie i wpisać tmux attach.

Oto przykład.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion

nie mam tmux i nie wolno mi instalować rzeczy, których nie ma na mojej liście rzeczy do zrobienia ...

5
@sergio Moje serce krwawi :-)) Użyj screen.

4
@sergio W systemie Unix praktycznie każda aplikacja, która nie wymaga uprawnień roota, może zostać zainstalowana w katalogu domowym.
Kusalananda

35

Zalecenia dotyczące tmux i screena są dobrymi sugestiami. Podają odpowiedź na twoje pytanie, ale tak naprawdę nie określaj tego. Odpowiedź na pytanie brzmi: nie ma mowy. Jeśli zalogujesz się przez ssh, powłoka zostanie zakończona, gdy połączenie zostanie zerwane. Obejściem problemu jest zalogowanie się i natychmiastowe uruchomienie wirtualnego terminala (np. tmux). Po zerwaniu połączenia zakończona jest powłoka, w której się znajdujesz, ale możesz otworzyć nową powłokę i ponownie połączyć się z terminalem wirtualnym (czyli z powłoką, w której faktycznie wykonujesz swoją pracę).


Dobrze. teraz jest jasne.

Zakładając, że mniam proces nadal działa (nie zakończył się natychmiast, gdy powłoka otrzymała SIGHUP), reptyr lub podobny może być wystarczający do odzyskania procesu lub - jeśli to się nie powiedzie - uzyskać jakiekolwiek przyszłe wyniki. Powłoka byłaby jednak na ogół zakończona po rozłączeniu.
Eroen

@Eroen Masz na myśli, że nawet jeśli używasz Tmux, system operacyjny zakończy proces Tmux, gdy stwierdzi, że połączenie zostało utracone?
Dojo

@Dojo Po zakończeniu połączenia instancja tmux zostanie zatrzymana, ale sesja tmux (i powłoki, którymi zarządza) pozostanie aktywna.
William Pursell

Jeśli użytkownik utracił połączenie ze zdalnym serwerem ssh, ponieważ na przykład nagle przypadkowo odłączył kabel RJ-45, myślę, że serwer ssh nadal utrzymuje tę sesję do określonego czasu (na przykład 120 sekund). Czy w takim przypadku jest sposób na wznowienie sesji, która nadal trwa po stronie serwera ssh w ciągu 120 sekund po odłączeniu kabla?
Gab 是 好人

8

Jak powiedział William, krótka odpowiedź brzmi: nie, nie ma mowy. Aby temu zapobiec, możesz użyć polecenia screen przed utratą połączenia


z tego co rozumiem, musiałbym zainicjować yum z ekranem ... no cóż, nie zrobiłem tego. Nie mogę ponownie uruchomić mniam, mówi, że nadal jest używany i nie chcę zmuszać go do zabicia. ..jak mogę odzyskać kontrolę nad biegnącym mniam?

i byobu jest miłym uzupełnieniem do ekranu, aby automatycznie uruchomił w ładnym graficznym terminalu launchpad.net/byobu

O ile wiem, nie możesz, chyba że istnieje jakiś ukryty sposób na przekierowanie wyjścia z polecenia yum do bieżącej sesji terminowej, ale nie mogę wymyślić żadnego z góry.
Nicholas Smith

Istnieje wiele częściowych rozwiązań tego problemu za pomocą debuggerów & c. aby nadać procesowi nową powłokę nadrzędną. Reptyr to jeden, a post na blogu opisuje problem, obejście i niektóre inne implementacje.
Eroen

3

Nie, nie można odzyskać powłoki po rozłączeniu. Zamiast tego możesz upewnić się, że uruchomione polecenie nadal działa po rozłączeniu.

Aby to osiągnąć, użyj poleceń „nohup” i „disown”, które są zwykle wbudowanymi poleceniami większości powłok, tzn. Nie musisz niczego instalować. Działa to jednak tylko w przypadku poleceń nieinteraktywnych.

Kroki byłyby zatem następujące:

  1. Zaloguj się do serwera
  2. Uruchom polecenie: „nohup sudo yum update &” (spowoduje to również zalogowanie wszystkich danych wyjściowych do pliku nohup.out w bieżącym katalogu)
  3. Uruchom „disown% 1”
  4. W tym momencie możesz się rozłączyć lub poczekać na rozłączenie :)

Gdy wrócisz na serwer, po prostu „tail nohup.out”, aby zobaczyć, jak działa polecenie.


Czy w ogólnym przypadku nie działałoby to dość źle ? Na przykład z poleceniami, które chcą wejść w tym samym czasie ... W przypadku całkowicie nieinteraktywnych poleceń, może działać wystarczająco dobrze i uniknąć narzutu (i ewentualnie konieczności instalacji) multipleksera terminalowego.
CVn

Tak, działa to tylko wtedy, gdy twoje polecenia nie chcą wkładu użytkownika, zaktualizowałem odpowiedź. Ogólnie rzecz biorąc, na pewno warto skorzystać z multipleksera terminali, ale wspomniano, że nie można instalować żadnych dodatkowych narzędzi.
zygis

Oczywiście jest to prawidłowa odpowiedź, tylko nieznacznie ograniczona w możliwych przypadkach użycia. Pozytywne z powodu edycji.
CVn

3

Ktoś dodał w odpowiedzi komentarz, a nie odpowiedź, więc nie mogę go głosować, ale wydaje się to dobrą odpowiedzią na edytowane pytanie i działał świetnie na CentOS.

patrz: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

Czy istnieje sposób na odzyskanie zawieszonych sesji po ponownym połączeniu?

EDYCJA: robię trochę aktualizacji i instalacji z yum i martwię się, że może to być problem, jeśli procesy będą się zawieszać w środku tego, co robią.

Tak samo, straciłem zdalne połączenie z sesją aktualizacji mniam. Więc szukałem i znalazłem to pytanie ... potem ponownie połączyłem się i użyłem ekranu tym razem:

  1. podłącz ponownie ssh
  2. ekran
  3. zainstaluj reptyr zgodnie z powyższymi linkami
  4. ps -a | grep mniam
  5. reptyr psid

i oto jestem na odzyskanej zachęcie, którą wygłosiłeś kilka godzin wcześniej.

Z technicznego punktu widzenia wszystkie odpowiedzi są poprawne, NIE jest to odzyskiwanie zawieszonej sesji, oznacza ona przywrócenie osieroconego procesu do bieżącej sesji. I bardzo użyteczne, to też ...


1

Jak wiele osób sugerowało screen, a tmuxoni obsługują podstawowe funkcje, ale mają różne cechy szczególne, więc nie można powiedzieć, że jeden jest lepszy od drugiego w każdym przypadku. Na przykład tylko tmux obsługuje dzielenie okien , podczas gdy tylko ekran GNU może przełączać zawijanie długich linii za pomocą (Ctrl + ar). Zobacz bardziej szczegółowe porównanie tutaj .

Istnieją również narzędzia do rozwiązania tego problemu z ssh:

Autossh to program, który uruchamia kopię ssh i monitoruje ją, uruchamiając ją ponownie, jeśli to konieczne, w przypadku śmierci lub zatrzymania ruchu. Pomysł pochodzi z rstunnel.

Mosh to zdalna aplikacja terminalowa, która umożliwia roaming, obsługuje przerywane połączenia oraz zapewnia inteligentne lokalne echo i edycję linii klawiszy użytkownika. Mosh zastępuje SSH. Jest bardziej niezawodny i responsywny, szczególnie w przypadku połączeń Wi-Fi, komórkowych i dalekobieżnych.


-1

Można to zrobić za pomocą tmuxpowłoki. Jeśli zostaniesz rozłączony, najszybszym sposobem ponownego przyłączenia sesji jest:

tmux a #0

Nie dodaje to niczego, czego nie mówi zaakceptowana odpowiedź. Zakłada również, że użytkownik ma już tmuxuruchomioną sesję.
Kusalananda

2
Może to być komentarz do tej odpowiedzi, który brzmi „możesz skrócić attachjako a”.
Jeff Schaller
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.