Ich verwende den reboot -f
Befehl remote, um einen Neustart eines Unix-Rechners zu erzwingen. Das Problem ist, dass die SSH-Verbindung für eine lange Zeit aktiv bleibt, ich weiß nicht warum? Ich möchte die SSH-Verbindung sofort nach dem Neustart des Computers schließen und zu meiner lokalen Shell zurückkehren. Wie kann ich das machen? Beachten Sie, dass der Neustartbefehl ohne -f
Flag nicht funktioniert.
18
Enter
. Dann zB~.
um die Sitzung zu beenden.Enter ~?
für eine Liste von anderen.Antworten:
Der Befehl wird
reboot -f
nie zurückgegeben (es sei denn, Sie hatten keine Berechtigung, einen Neustart durchzuführen). Zum Zeitpunkt der Ausgabe wartet der SSH-Client auf Folgendes:Da der SSH-Serverprozess tot ist, stirbt der SSH-Client erst, wenn der Zeitgeber ausgelöst wird.
Wenn Sie rennen
ssh remotehost 'reboot -f >/dev/null &'
, passiert Folgendes:reboot
Befehl im Hintergrund.reboot
Befehl bewirkt einen Neustart des Computers.Dies ist jedoch nicht zuverlässig: Abhängig vom Timing kann Schritt 3 vor Schritt 2 erfolgen. Das Hinzufügen eines Timers macht Folgendes unwahrscheinlich:
Um absolut sicherzugehen, dass die Serverseite für die Ausführung festgeschrieben ist,
reboot
und gleichzeitig sicherzustellen, dass sie nicht neu gestartet wird, bevor der Client über die Festschreibung benachrichtigt wird, benötigen Sie eine zusätzliche Benachrichtigung, um vom Server zum Client zu wechseln. Dies kann über die SSH-Verbindung ausgegeben werden, wird jedoch kompliziert.quelle
(sleep 1 && sudo reboot &) && exit
. Die Klammern erzeugen einen Unterprozess, der eine Sekunde wartet und dann den Neustart einleitet. Der Host-Prozess beendet die ssh-Sitzung jedoch sofort. Ich bin kein Shell-Guru, aber das hat bisher bei mir funktioniert.Ich fand diese Lösung am besten für mich.
Verwenden Sie
-o "ServerAliveInterval 2"
mit Ihremssh
Befehl wie folgt:Diese Option veranlasst die Clientseite, den Server alle 2 Sekunden über einen sicheren Kanal anzusteuern. Wenn der Neustart fortgesetzt wird, reagiert er nicht mehr und der Client trennt die Verbindung.
quelle
Einige Antworten waren knapp, aber die richtige Antwort lautet:
Erläuterung:
exit
als letzten Befehl den Status 0 (Erfolg) des letzten Befehls angeben. Wenn Sie möchten, können Sie einen Schlaf vorbereiten, dies ist jedoch nicht erforderlichstdin
undstdout
weiterhin über SSH mit dem virtuellen Terminal verbunden sind, so dass die Verbindung nicht geschlossen wird. Sie müssen zwei zusätzliche Schritte ausführen, damit die SSH-Sitzung beendet wird und der Befehl im Hintergrund ausgeführt wird.stdout
undstderr
zu ,/dev/null
so dass sie durch das virtuelle Terminal nicht weitergeleitet werden, der die SSH - Sitzung hält. Das ist der&>/dev/null
Teil.stdin
die gleiche Weise zu einer nicht lesbaren Datei umleiten . Das macht die eingebaute Shellnohup
.Wenn nur ein Befehl im Hintergrund ausgeführt wird, der in keiner Weise vom Terminal getrennt wurde,
exit
wird die Sitzung geschlossen, und da auf dem virtuellen Terminal keinstdin
oder keinstdout
SSH mehr vorhanden ist, wird die Verbindung ohne Fehler beendet.quelle
Ich benutze den folgenden Befehl:
ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'
Folgendes tut dies:
quelle
Hast du folgendes versucht
Ich stelle fest, dass auf einigen Systemen, an denen ich in der Zwischenzeit gearbeitet habe, der Befehl zum Neustart einige Probleme hatte. Andererseits kann ich in der Manpage von shutdown nichts finden, was dasselbe bewirken würde wie einen Neustart mit dem Flag -f.
quelle
Wie wäre es, wenn Sie die SSH-Sitzung beenden und das System mit dem nächsten Befehl neu starten würden:
Drücken Sie danach einfach Strg + C, um ssh zu beenden.
quelle
Ich habe eine Lösung dafür gefunden, die auch für andere hilfreich sein könnte. Ich habe den folgenden Befehl verwendet, um die Verbindung direkt nach dem Start des an ssh angehängten Befehls zu schließen:
Ich verstehe nicht genau, warum dieser Befehl das Schließen der Verbindung erzwingt, aber es war zumindest hilfreich für mich. Wenn jemand versteht, warum es die SSH-Verbindung beendet; bitte erkläre.
quelle
Dies erfordert eine Verzögerung von 1 Minute, hat aber bei mir zuverlässig funktioniert und löst das Problem, dass der SSH-Client hängen bleibt:
Dadurch wird das Herunterfahren des Systems für eine Minute später geplant, wodurch Zeit für das Abmelden und damit für die Beendigung von SSH verbleibt. Wenn Sie so wenig Zeit wie möglich warten möchten, können Sie die ersetzen
+1
mitHH:MM
einer rasch näher Tageszeit , aber das kann richtig Zeit schwierig sein und zu einer 59 Sekunden Verzögerung kann bis.quelle
Eine einfache Möglichkeit, die ich gefunden habe, besteht darin, das Herunterfahren / Neustarten als Hintergrundaufgabe zu befehlen (mit '&') und es vor dem Schließen zu schützen, wenn die Sitzung mit 'nohup' geschlossen wird, zusammen mit dem sofortigen Beenden der Shell / Sitzung:
nohup shutdown -r now & exit
Auf diese Weise bleibt der SSH-Client nicht hängen, da die Sitzung sofort beendet wird, während das ferne System asynchron neu gestartet wird.
quelle
Versuchen Sie diesen Befehl:
quelle
reboot -f
.