Estou usando o reboot -f
comando remotamente para forçar a reinicialização de uma máquina Unix. O problema é que a conexão ssh permanece ativa por um longo tempo, e não sei por quê? Quero fechar a conexão ssh imediatamente após reiniciar a máquina e retornar ao meu shell local. Como eu posso fazer isso? Observe que o comando reboot sem -f
sinalizador não funciona.
18
Enter
. Então, por exemplo,~.
para encerrar a sessão.Enter ~?
para uma lista de outras pessoas.Respostas:
O comando
reboot -f
nunca retorna (a menos que você não tenha permissão para causar uma reinicialização). No momento em que é emitido, o cliente SSH está aguardando algo para fazer, o que pode ser:Como o processo do servidor SSH está inoperante, o cliente SSH não morre até que o cronômetro seja acionado.
Se você executar
ssh remotehost 'reboot -f >/dev/null &'
, o que acontece é:reboot
comando em segundo plano.reboot
comando faz com que a máquina seja reinicializada.No entanto, isso não é confiável: dependendo do tempo, a etapa 3 pode ocorrer antes da etapa 2. A adição de um timer torna isso improvável:
Para ter certeza absoluta de que o lado do servidor está comprometido com a execução
reboot
, assegurando-se de que ele não seja realmente reiniciado antes de notificar o cliente de que está comprometido, você precisa de uma notificação adicional para passar do servidor para o cliente. Isso pode ser emitido através da conexão SSH, mas fica complicado.fonte
(sleep 1 && sudo reboot &) && exit
. Os parênteses geram um subprocesso, que espera um segundo e, em seguida, inicia a reinicialização. O processo host, no entanto, termina imediatamente a sessão ssh. Eu não sou um guru de conchas, mas isso funcionou para mim até agora.Encontrei esta solução para executar o melhor para mim.
Use
-o "ServerAliveInterval 2"
com seussh
comando, assim:A opção mencionada faz o lado do cliente cutucar o servidor em um canal seguro a cada 2 segundos. Eventualmente, à medida que a reinicialização prossegue, ele para de responder e o cliente interrompe a conexão.
fonte
Algumas respostas foram próximas, mas a resposta certa é:
explicação:
exit
como o último comando para que o status do último comando seja 0 (êxito). Você pode adormecer se desejar, mas não é necessáriostdin
estdout
ainda está conectado ao terminal virtual por meio do SSH; portanto, a conexão não será fechada. Você precisa fazer duas coisas extras para que a sessão SSH termine e deixe o comando em execução em segundo plano.stdout
estderr
para/dev/null
que eles não sejam redirecionados pelo terminal virtual que mantém a sessão SSH. Essa é a&>/dev/null
parte.stdin
para um arquivo ilegível da mesma maneira. É isso que o shell internonohup
faz.Com apenas um comando em execução em segundo plano desanexado do terminal em todos os sentidos,
exit
a sessão será encerrada e, como não existestdin
ou aindastdout
resta no terminal virtual, o SSH encerrará a conexão sem erros.fonte
Eu uso o seguinte comando:
ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'
Aqui está o que isso está fazendo:
fonte
Você já tentou o seguinte
Acho que em alguns sistemas em que trabalhei no passe, o comando reboot teve alguns problemas. Então, novamente, não consigo encontrar nada na página de manual do desligamento que faria o mesmo que reiniciar com o sinalizador -f.
fonte
Que tal sair da sessão ssh e reiniciar o sistema usando o próximo comando:
Depois disso, pressione Ctrl + C para finalizar o ssh.
fonte
Encontrei uma solução para isso que também pode ser útil para outras pessoas. Usei o seguinte comando para fechar a conexão logo após iniciar o comando anexado ao ssh:
Não entendo exatamente o motivo pelo qual esse comando força a conexão a fechar, mas pelo menos foi útil para mim. Se alguém entender por que mata a conexão ssh; Por favor explique.
fonte
Isso requer um atraso de 1 minuto, mas funcionou de maneira confiável para mim e resolve o problema do travamento do cliente SSH:
Isso programa o desligamento do sistema por 1 minuto depois, o que permite que o logout e, portanto, a finalização do SSH, sejam concluídos. Se você quiser esperar tão pouco tempo quanto possível, você poderia substituir o
+1
comHH:MM
por um tempo se aproximando rapidamente de dia, mas que pode ser complicado para o tempo corretamente e pode ter até um segundo atraso 59.fonte
Uma maneira simples que encontrei é comandar o desligamento / reinicialização como uma tarefa em segundo plano (usando '&'), protegendo-o de ser fechado quando a sessão fechar com 'nohup', juntamente com a saída imediata do shell / sessão:
nohup shutdown -r now & exit
Dessa forma, o cliente SSH não trava, pois a sessão é encerrada imediatamente, enquanto o sistema remoto continua com a reinicialização de forma assíncrona.
fonte
Tente este comando:
fonte
reboot -f
.