Więc działałem apt-get upgrade
na serwerze, kiedy router uznał, że minęło zbyt wiele czasu, odkąd ostatnio mnie zdenerwował: porzucił wszystkie połączenia. Morał tej historii jest screen
częste korzystanie z routera typu bum.
W każdym razie zalogowałem się ponownie i stwierdziłem w htopie, że proces nadal tam wisiał, wciąż czekając na aktualizację Y / n (na szczęście jeszcze go nie trafiłem). Czy jest jakiś sposób, aby ponownie dołączyć do sesji, która została przerwana? Skończyło się na tym, że zabiłem go, ponieważ nie było to w środku zarządzania pakietami, ale byłoby wspaniale wiedzieć na przyszłość.
apt-get
proces wciąż działał. Powinien był umrzeć wraz z całym łańcuchem procesu aż do SSH. Zauważyłem, żedo-dist-upgrade
automatycznie rozpoczyna się w sesjiscreen
/byobu
: może w niektórych okolicznościachapt-get
to samo?Odpowiedzi:
Odpowiedź na twoje właściwe pytanie brzmi: nie możesz . Myślę, że głównym problemem jest brak synchronizacji procedur uwierzytelniania. To po prostu tak nie działa.
Jak zauważyłeś, rozwiązaniem jest użycie screena , gdy jest to możliwe (przy okazji, tmux jest alternatywą dla screena ).
źródło
byobu
jest ładnym, łatwiejszym w użyciuscreen
tmux
Do uruchamiania długotrwałych procesów używam screen lub byobu, jeśli chcesz bardziej przyjazny interfejs.
Do ekranu możesz użyć:
Spowoduje to uruchomienie [programu] i jego [argumentów] w sesji ekranowej . Po zakończeniu programu sesja jest automatycznie zamykana. Jeśli chcesz zachować sesję po uruchomieniu programu, po prostu uruchom screen bez żadnych argumentów, a wewnątrz sesji pojawi się nowy monit. CTRL + A + D odłącza terminal od bieżącej sesji.
Aby ponownie dołączyć do poprzedniej sesji:
Jeśli otwarta jest tylko jedna sesja, zostanie ona ponownie podłączona natychmiast. Jeśli trwa wiele sesji, zostanie wyświetlone pytanie, do której chcesz dołączyć. Jeśli znasz nazwę sesji, możesz po prostu dodać ją jako argument do tego wiersza poleceń.
Byobu to niezła poprawa. Opiera się na ekranie , ale u dołu znajduje się pasek, który pokazuje wszystkie bieżące sesje jako karty i umożliwia łatwiejsze poruszanie się po nich. Możesz:
SŁOWA PORADY : unikaj pozostawiania sesji otwartej przy użyciu katalogu głównego użytkownika . Jeśli ktoś uzyska dostęp do twojego terminala (lokalnie lub zdalnie), może łatwo ponownie dołączyć do trwającej sesji i użyć twojego systemu jako root. W razie potrzeby najlepiej rozpocząć sesję przy użyciu zwykłego wiersza poleceń użytkownika i sudo w razie potrzeby.
źródło
Chociaż nie możesz ponownie dołączyć się do uszkodzonej sesji SSH, możesz ponownie rozpoznać proces uruchomiony w SSH - funkcjonalnie równoważny z tym, czego chcesz.
Instrukcje
W twoim przypadku przejmiesz
apt-get
proces kontrolowany z nowej sesji SSH,screen
sesji itp. Moim ulubionym do tego jestreptyr
polecenie:Następnie z pid znalezionym dla twojego procesu:
Lub jeśli to nie zadziała, spróbuj:
Po tym etapie wszystkie dane wprowadzane z klawiatury przechodzą do przejętego programu. Niestety nie zobaczysz starych danych wyjściowych sesji SSH, takich jak dane
apt-get
wyjściowe z prośbą o potwierdzenie.Objaśnienia
Istnieje wiele innych narzędzi, które działają w zasadzie tak samo jak
reptyr
(tzn. Poprzezptrace
załącznik debugowania). Zapoznaj się z następującymi pytaniami i odpowiedziami:W powyższych instrukcjach
reptyr 10626
używaptrace
załącznika debugowania, podczas gdysudo reptyr -T 10626
polecenie używa kradzieży TTY i jest preferowane ( szczegóły ).Wreszcie powodem, dla którego nie można przejąć sesji SSH w ten sposób, jest to, że
sshd
proces nie jest kontrolowany przez terminal hosta, zamiast tego zapewnia niewolniczą część terminala -pts
urządzenie - podczas gdy kontrolująca go część master znajduje się na komputer kliencki, tutaj z przerwaną sesją SSH pomiędzy. Kiedy wymusza się przejęcie takiegosshd
procesureptyr -s <pid>
, klawiatura wpisuje się w ten proces, a nie w aktywny proces potomny. Więc „Ctrl + Z” po prostu to zabijesshd
.źródło
Dlatego robiłem
do-dist-upgrade
przez ssh z laptopa, który został zawieszonyBroken pipe
. Po powrocie do komputera widziałem, że nadal działają procesy związane z aktualizacją, w tymwhiptail
pytanie o dane wejściowe (który menedżer wyświetlania wybrać) i, odpowiednio, rootSCREEN
. Byłem w stanie to zrobićsudo su -
iscreen -r
dołączyć do sesji, a oto, mam przed sobą okno dialogowe whiptail, które jest w stanie uzyskać wkład. Udało mi się bezproblemowo wznowić aktualizację.Uwaga: była to aktualizacja z Ubuntu 14.04 do 16.04.
źródło