J'utilise la reboot -f
commande à distance pour forcer le redémarrage d'une machine Unix. Le problème est que la connexion ssh reste active pendant longtemps, je ne sais pas pourquoi? Je veux fermer la connexion ssh immédiatement après le redémarrage de la machine et revenir à mon shell local. Comment puis je faire ça? Notez que la commande de redémarrage sans -f
indicateur ne fonctionne pas.
18
Enter
. Ensuite, par exemple~.
pour terminer la session.Enter ~?
pour une liste des autres.Réponses:
La commande
reboot -f
ne revient jamais (sauf si vous n'avez pas été autorisé à provoquer un redémarrage). Au moment où il est émis, le client SSH attend quelque chose à faire, ce qui pourrait être:Étant donné que le processus du serveur SSH est mort, le client SSH ne mourra pas tant que la minuterie ne se déclenchera pas.
Si vous courez
ssh remotehost 'reboot -f >/dev/null &'
, alors ce qui se passe est:reboot
commande en arrière-plan.reboot
commande provoque le redémarrage de la machine.Cependant, cela n'est pas fiable: selon le moment, l'étape 3 peut se produire avant l'étape 2. L'ajout d'un minuteur rend cela peu probable:
Pour être absolument sûr que le côté serveur est engagé dans l'exécution
reboot
, tout en s'assurant qu'il ne redémarre pas réellement avant d'aviser le client qu'il est validé, vous avez besoin d'une notification supplémentaire pour passer du serveur au client. Cela peut être émis via la connexion SSH, mais cela devient compliqué.la source
(sleep 1 && sudo reboot &) && exit
. Les parenthèses génèrent un sous-processus, qui attend une seconde, puis lance le redémarrage. Cependant, le processus hôte met immédiatement fin à la session ssh. Je ne suis pas un gourou des coquillages, mais cela a fonctionné pour moi jusqu'à présent.J'ai trouvé cette solution pour faire le meilleur pour moi.
Utilisez
-o "ServerAliveInterval 2"
avec votressh
commande, comme ceci:Cette option oblige le côté client à pousser le serveur sur un canal sécurisé toutes les 2 secondes. Finalement, au fur et à mesure du redémarrage, il cessera de répondre et le client interrompra la connexion.
la source
Certaines réponses étaient proches, mais la bonne réponse est:
explication:
exit
tant que dernière commande afin que le statut de la dernière commande soit 0 (succès). Vous pouvez ajouter un sommeil si vous le souhaitez, mais ce n'est pas nécessairestdin
etstdout
sont toujours connectés au terminal virtuel via SSH, de sorte que la connexion ne sera pas fermée. Vous devez faire deux choses supplémentaires pour que la session SSH se termine et laisser la commande s'exécuter en arrière-plan.stdout
etstderr
vers/dev/null
afin qu'ils ne soient pas redirigés par le terminal virtuel qui détient la session SSH. C'est le&>/dev/null
partie.stdin
vers un fichier illisible de la même manière. C'est ce que fait le shell intégrénohup
.Avec seulement une commande exécutée en arrière-plan détachée du terminal dans tous les sens,
exit
fermera la session et parce qu'il n'y en a passtdin
oustdout
reste sur le terminal virtuel, SSH mettra fin à la connexion sans erreur.la source
J'utilise la commande suivante:
ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'
Voici ce que cela fait:
la source
Avez-vous essayé ce qui suit
Je trouve que sur certains systèmes sur lesquels j'ai travaillé dans la passe, la commande de redémarrage a eu quelques problèmes. Là encore, je ne trouve rien dans la page de manuel de shutdown qui ferait la même chose que le redémarrage avec l'indicateur -f.
la source
Que diriez-vous de quitter la session ssh et de redémarrer le système à l'aide de la commande suivante:
Après cela, appuyez simplement sur Ctrl + C pour terminer ssh.
la source
J'ai trouvé une solution pour cela qui pourrait également être utile pour d'autres. J'ai utilisé la commande suivante pour fermer la connexion juste après avoir démarré la commande attachée à ssh:
Je ne comprends pas exactement la raison pour laquelle cette commande force la fermeture de la connexion mais au moins cela m'a été utile. Si quelqu'un comprend pourquoi il tue la connexion ssh; S'il vous plaît, expliquez.
la source
Cela nécessite un délai d'une minute mais a fonctionné de manière fiable pour moi et résout le problème du blocage du client SSH:
Cela planifie l'arrêt du système pendant 1 minute plus tard, ce qui laisse le temps à la déconnexion, et donc à la terminaison SSH, de se terminer. Si vous voulez attendre le moins de temps possible, vous pouvez remplacer le
+1
parHH:MM
pour une heure de la journée qui approche rapidement, mais cela peut être difficile à chronométrer correctement et peut avoir jusqu'à 59 secondes de retard.la source
Un moyen simple que j'ai trouvé, est de commander l'arrêt / redémarrage en tant que tâche d'arrière-plan (en utilisant '&'), en le protégeant de la fermeture lorsque la session se ferme avec 'nohup', ainsi que la sortie immédiate du shell / session:
nohup shutdown -r now & exit
De cette façon, le client SSH ne se bloque pas, car la session se ferme immédiatement, tandis que le système distant procède à son redémarrage de manière asynchrone.
la source
Essayez cette commande:
la source
reboot -f
.