다시 시작한 후 ssh 명령을 사용하여 연결을 닫습니다.

다시 시작한 후 ssh 명령을 사용하여 연결을 닫습니다.

저는 reboot -f이 명령을 원격으로 사용하여 Unix 시스템을 강제로 다시 시작하고 있습니다. 문제는 SSH 연결이 오랫동안 활성 상태로 유지되는데 그 이유를 모르겠다는 것입니다. SSH 연결을 닫고 컴퓨터를 다시 시작한 후 즉시 로컬 셸로 돌아가고 싶습니다. 어떻게 해야 하나요? 플래그가 없는 재시작 명령은 -f아무 효과가 없습니다.

답변1

reboot -f재부팅할 권한이 없는 한 명령이 반환되지 않습니다. 이 명령이 실행되면 SSH 클라이언트는 다음과 같은 일부 작업이 수행되기를 기다리고 있습니다.

  • SSH 서버는 표시할 출력이 있거나 원격 명령이 완료되는 등 주의가 필요한 일이 발생했음을 클라이언트에 알립니다.
  • 중계될 신호와 같이 클라이언트 측에서 발생한 일부 이벤트
  • 타이머가 시작되어 클라이언트가 연결 유지 메시지를 보내게 합니다(또는 서버가 응답하지 않으면 연결을 닫습니다).

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

다음을 실행하면 ssh remotehost 'reboot -f >/dev/null &'어떻게 되나요 ?

  1. 원격 셸은 reboot백그라운드에서 명령을 시작합니다.
  2. 서버측 셸 명령이 종료되었고 표준 출력 파일 설명자를 열어 둔 프로세스가 없기 때문에 SSH 서버는 연결을 닫습니다.
  3. reboot명령을 실행하면 머신이 재부팅됩니다.

그러나 이는 신뢰할 수 없습니다. 시기에 따라 3단계가 2단계보다 먼저 발생할 수도 있습니다. 타이머를 추가하면 이런 일이 발생할 가능성이 줄어듭니다.

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

서버 측이 running 으로 커밋되었는지 확실히 확인 reboot하는 동시에 커밋되었음을 클라이언트에 알리기 전에 실제로 다시 시작되지 않도록 하려면 서버에서 클라이언트로 추가 알림이 필요합니다. SSH 연결을 통해 출력할 수 있지만 복잡해집니다.

답변2

나는 이 솔루션이 나에게 가장 적합하다는 것을 알았습니다.

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

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

이 옵션을 사용하면 클라이언트가 2초마다 보안 채널을 통해 서버에 대한 요청을 시작합니다. 결국 재부팅이 진행되면서 응답이 중지되고 클라이언트 연결이 끊어집니다.

답변3

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

ssh [email protected] "nohup sudo reboot &>/dev/null & exit"

설명하다:

  • 마지막 명령이 되기를 원하므로 exit마지막 명령의 상태는 0(성공)입니다. 원하는 경우 수면 준비를 사전에 준비할 수 있지만 필수 사항은 아닙니다.
  • 백그라운드에서 재부팅을 실행해야 합니다. 그렇지 않으면 서버가 연결을 닫고 오류 메시지가 표시됩니다. 대부분의 시스템에서는 여전히 재부팅되지만 스크립트를 작성하는 경우 명령이 올바르게 실행되더라도 반환 상태는 오류(0이 아님)가 됩니다.
  • 백그라운드에서 실행하는 것만으로는 충분하지 않습니다. 은 stdin여전히 stdout​​SSH를 통해 가상 터미널에 연결되어 있으므로 연결이 닫히지 않습니다. SSH 세션을 종료하고 명령이 백그라운드에서 실행되도록 하려면 두 가지 작업을 수행해야 합니다.
    • 1) SSH 세션을 보유한 가상 터미널에 의해 리디렉션되지 않도록 리디렉션 stdout이 필요합니다. 이것이 바로 이 부분입니다.stderr/dev/null&>/dev/null
    • stdin2) 읽을 수 없는 파일에도 같은 방법으로 리디렉션 해야 합니다 . 이것이 쉘 내장 기능이 nohup하는 일입니다.

다양한 방법으로 터미널에서 분리된 백그라운드에서 명령을 실행해야만 exit세션이 닫히고, 가상 터미널에는 아무것도 남지 않았으므로 stdinSSH stdout는 오류 없이 연결을 종료합니다.

답변4

다음을 시도해 보셨나요?

# shutdown -r now

제가 작업한 일부 시스템에서 다시 시작 명령과 관련된 몇 가지 문제를 발견했습니다. 그런 다음 -f 플래그를 사용하여 다시 시작하는 것과 동일한 작업을 수행하는 종료 맨페이지에서 아무것도 찾을 수 없습니다.

관련 정보