Używam reboot -f
polecenia zdalnie, aby wymusić ponowne uruchomienie komputera z systemem Unix. Problem polega na tym, że połączenie ssh pozostaje aktywne przez długi czas, co nie wiem dlaczego? Chcę zamknąć połączenie ssh natychmiast po ponownym uruchomieniu komputera i powrócić do mojej lokalnej powłoki. Jak mogę to zrobić? Zauważ, że polecenie restartu bez -f
flagi nie działa.
18
Enter
. Następnie np.~.
Aby zakończyć sesję.Enter ~?
na listę innych.Odpowiedzi:
Polecenie
reboot -f
nigdy nie powraca (chyba że nie masz uprawnień do ponownego uruchomienia komputera). W momencie wydania klient SSH czeka na coś do zrobienia, na przykład:Ponieważ proces serwera SSH nie działa, klient SSH nie umrze, dopóki nie uruchomi się licznik czasu.
Jeśli uruchomisz
ssh remotehost 'reboot -f >/dev/null &'
, to co się stanie, to:reboot
polecenie w tle.reboot
polecenie powoduje ponowne uruchomienie komputera.Nie jest to jednak niezawodne: w zależności od czasu krok 3 może się zdarzyć przed krokiem 2. Dodanie timera sprawia, że jest to mało prawdopodobne:
Aby mieć absolutną pewność, że strona serwera jest zobowiązana do działania
reboot
, a jednocześnie upewniając się, że tak naprawdę nie uruchomi się ponownie przed powiadomieniem klienta o tym, że potrzebujesz, potrzebujesz dodatkowego powiadomienia, aby przejść z serwera do klienta. Można to wyprowadzić przez połączenie SSH, ale komplikuje się.źródło
(sleep 1 && sudo reboot &) && exit
. Nawiasy odradzają podproces, który czeka jedną sekundę, a następnie inicjuje ponowne uruchomienie. Proces hosta natychmiast jednak kończy sesję ssh. Nie jestem guru skorupy, ale jak dotąd to dla mnie zadziałało.Znalazłem to rozwiązanie, które działa najlepiej dla mnie.
Używaj
-o "ServerAliveInterval 2"
zssh
poleceniem:Ta opcja powoduje, że po stronie klienta szturmuje serwer bezpiecznym kanałem co 2 sekundy. W końcu, w miarę ponownego uruchamiania, przestanie odpowiadać, a klient zerwie połączenie.
źródło
Niektóre odpowiedzi były bliskie, ale prawidłowa odpowiedź to:
wyjaśnienie:
exit
jako ostatnie polecenie, więc stan ostatniego polecenia to 0 (sukces). Możesz spać, jeśli chcesz, ale nie jest to koniecznestdin
istdout
nadal są podłączone do terminala wirtualnego za pośrednictwem SSH, więc połączenie nie zostanie zamknięte. Musisz zrobić dwie dodatkowe rzeczy, aby sesja SSH zakończyła się, a komenda działała w tle.stdout
istderr
aby/dev/null
nie były przekierowywane przez terminal wirtualny, który przechowuje sesję SSH. To jest&>/dev/null
część.stdin
do nieczytelnego pliku w ten sam sposób. Tak właśnie działa wbudowana powłokanohup
.Gdy tylko komenda uruchomiona w tle zostanie odłączona od terminala pod każdym względem,
exit
zamknie sesję, a ponieważ na wirtualnym terminalu nie mastdin
lubstdout
pozostanie, SSH przerwie połączenie bez błędów.źródło
Używam następującego polecenia:
ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'
Oto, co to robi:
źródło
Czy wypróbowałeś następujące rzeczy?
Uważam, że w niektórych systemach, nad którymi pracowałem w przełęczy, polecenie ponownego uruchomienia miało pewne problemy. Z drugiej strony nie mogę znaleźć niczego na stronie zamykania, która działałaby tak samo jak restart z flagą -f.
źródło
Co powiesz na wyjście z sesji ssh i zrestartowanie systemu za pomocą następnego polecenia:
Następnie naciśnij Ctrl + C, aby zakończyć ssh.
źródło
Znalazłem rozwiązanie, które może być pomocne również dla innych. Użyłem następującego polecenia, aby zamknąć połączenie zaraz po uruchomieniu polecenia dołączonego do ssh:
Nie do końca rozumiem powód, dla którego to polecenie wymusza zamknięcie połączenia, ale przynajmniej było to dla mnie pomocne. Jeśli ktoś zrozumie, dlaczego to zabija połączenie ssh; proszę wytłumacz.
źródło
Wymaga to 1-minutowego opóźnienia, ale działało dla mnie niezawodnie i rozwiązuje problem zawieszenia klienta SSH:
To planuje zamknięcie systemu na 1 minutę później, co daje czas na wylogowanie, a tym samym zakończenie SSH. Jeśli chcesz czekać tak mało czasu jak to możliwe, można wymienić
+1
zeHH:MM
przez pewien czas szybko zbliżającego się dnia, ale to może być trudne do czasu prawidłowo i może mieć do 59 sekundowym opóźnieniem.źródło
Prostym sposobem, który znalazłem, jest polecenie zamknięcia / ponownego uruchomienia komputera jako zadania w tle (używając „&”), chroniąc go przed zamknięciem, gdy sesja kończy się za pomocą „nohup”, wraz z natychmiastowym wyjściem z powłoki / sesji:
nohup shutdown -r now & exit
W ten sposób klient SSH nie zawiesza się, ponieważ sesja kończy się natychmiast, a system zdalny uruchamia się ponownie asynchronicznie.
źródło
Wypróbuj to polecenie:
źródło
reboot -f
.