ssh 명령을 사용하여 재부팅을 실행 한 후 연결 종료 -f유닉스 머신을 강제로 재부팅하기

reboot -f유닉스 머신을 강제로 재부팅하기 위해 명령을 원격으로 사용하고 있습니다. 문제는 ssh 연결이 오랫동안 활성 상태로 유지되는 이유는 무엇입니까? 컴퓨터를 재부팅 한 직후 ssh 연결을 닫고 로컬 셸로 돌아가고 싶습니다. 어떻게해야합니까? -f플래그가없는 재부트 명령 은 작동하지 않습니다.



답변

reboot -f재부팅을 유발할 권한이 없으면 명령이 반환되지 않습니다. SSH 클라이언트가 발행되는 시점에서 SSH 클라이언트는 다음을 수행 할 수있는 작업을 기다리고 있습니다.

  • 표시 할 출력이 있거나 원격 명령이 완료된 경우와 같이주의가 필요한 일이 발생했음을 클라이언트에 알리는 SSH 서버.
  • 중계 할 신호와 같은 클라이언트 측의 일부 이벤트;
  • 클라이언트가 keepalive 메시지를 보내고 서버가 응답하지 않으면 연결을 닫도록 타이머가 작동합니다.

SSH 서버 프로세스가 종료되었으므로 타이머가 시작될 때까지 SSH 클라이언트가 종료되지 않습니다.

를 실행 ssh remotehost 'reboot -f >/dev/null &'하면 다음과 같은 결과가 발생합니다.

  1. 원격 쉘은 reboot백그라운드 에서 명령을 시작합니다 .
  2. 서버 측 쉘 명령이 종료되었고 표준 출력 열기를위한 파일 디스크립터를 보유하는 프로세스가 없으므로 SSH 서버가 연결을 닫습니다.
  3. reboot명령은 머신을 재부팅합니다.

그러나 이는 신뢰할 수 없습니다. 타이밍에 따라 3 단계는 2 단계 전에 발생할 수 있습니다. 타이머를 추가하면 가능성이 낮아집니다.

ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'

서버 쪽이 실행되도록 커밋 reboot됨을 확실히 확인하려면 클라이언트에게 커밋되었음을 알리기 전에 실제로 재부팅하지 않는지 확인하려면 서버에서 클라이언트로 이동하려면 추가 알림이 필요합니다. 이것은 SSH 연결을 통해 출력 될 수 있지만 복잡해집니다.


답변

나는이 솔루션이 나를 위해 최선을 다한다는 것을 알았습니다.

다음 -o "ServerAliveInterval 2"과 같이 ssh명령 과 함께 사용하십시오 .

$ ssh -o "ServerAliveInterval 2" root@remotehost reboot

상기 옵션은 클라이언트 측이 2 초마다 보안 채널을 통해 서버를 찌르도록합니다. 결국 재부팅이 진행되면 응답이 중지되고 클라이언트가 연결을 끊습니다.


답변

일부 답변은 비슷했지만 정답은 다음과 같습니다.

ssh user@192.168.0.130 "nohup sudo reboot &>/dev/null & exit"

설명:

  • exit마지막 명령의 상태가 0 (성공)이되도록 마지막 명령으로 사용 하려고합니다 . 원하는 경우 수면을 추가 할 수 있지만 필요하지는 않습니다
  • 그렇지 않으면 서버가 연결을 닫고 오류가 발생하기 때문에 백그라운드에서 재부팅을 실행해야합니다. 여전히 대부분의 시스템에서 재부팅되지만 스크립트를 작성하는 경우 명령이 제대로 실행 되더라도 리턴 상태는 오류가 아닙니다 (0이 아님).
  • 는 AS 배경에서 실행하는 것은 충분하지 않습니다 stdin와는 stdout연결이 종료되지 않도록 여전히 SSH를 통해 가상 터미널로 연결되어 있습니다. SSH 세션을 종료하고 백그라운드에서 명령을 실행하려면 두 가지 추가 작업을 수행해야합니다.
    • 1) 당신은 리디렉션 할 필요가 stdoutstderr/dev/null그들이 SSH 세션을 보유하고있는 가상 터미널로 리디렉션되지 않도록. 이것이 &>/dev/null부분입니다.
    • 2) stdin읽을 수없는 파일로 동일한 방식 으로 리디렉션해야합니다 . 그것이 쉘 내장 기능 nohup입니다.

모든 방법으로 터미널에서 분리 된 백그라운드에서 실행중인 명령 만 사용하면 exit세션이 닫히고 가상 터미널에 stdin없거나 stdout남아 있기 때문에 SSH는 오류없이 연결을 종료합니다.


답변

다음 명령을 사용합니다.

ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'

이 작업은 다음과 같습니다.

  • 이 명령은 수행하지 않고 다음 순간에 시스템을 재부팅하도록 지시합니다.
  • SSH에서 깨끗하게 종료
  • sudo가 행복하고 제대로 실행될 수 있도록 SSH TTY를 전체 시간 동안 유지합니다.

답변

다음을 시도 했습니까

# shutdown -r now

패스로 작업 한 일부 시스템에서 재부팅 명령에 문제가 있음을 발견했습니다. 그런 다음 다시 종료 맨 페이지에서 -f 플래그를 사용하여 재부팅하는 것과 동일한 작업을 찾을 수 없습니다.


답변

다음 명령을 사용하여 ssh 세션을 종료하고 시스템을 재부팅하는 방법은 무엇입니까?

ssh login@host "reboot -f"

그런 다음 Ctrl + C를 눌러 ssh를 종료하십시오.


답변

다른 사람들에게도 도움이 될 수있는 해결책을 찾았습니다. ssh에 연결된 명령을 시작한 직후 다음 명령을 사용하여 연결을 닫았습니다.

ssh host "command to run on the host machine > /dev/null &"

이 명령이 연결을 강제로 종료하는 이유를 정확히 이해하지 못했지만 적어도 도움이되었습니다. 누군가 그것이 왜 ssh 연결을 죽이는 지 이해한다면; 설명 해주십시오.