연결 해제 후 쉘을 복구하는 방법


36

원격 CentOS 5.6 컴퓨터에서 일부 작업을 수행 중이며 네트워크가 계속 끊어집니다. 다시 연결 한 후 중단 된 세션을 복구 할 수있는 방법이 있습니까?

편집 : yum으로 일부 업데이트 및 설치를 수행 중이며 프로세스가 진행중인 작업의 중간에 프로세스가 계속 중단되면 이것이 문제가 될 수 있습니다.


6
tmux 또는 화면.
sehe

답변:


63

방법이 없지만 이것을 막기 위해 사용하는 것이 tmux좋습니다. tmux를 시작하고 작업을 시작한 후 계속 진행합니다. 돌아가서 연결이 끊어진 것을 발견하면 다시 연결하고 입력하기 만하면됩니다 tmux attach.

다음은 예입니다.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion

tmux를 가지고 있지 않으며, 할 일 목록에없는 것을 설치할 수 없습니다 ...

5
@sergio My heart bleeds :-)) 사용 screen.

4
@sergio Unix 시스템에서 루트 권한이 필요없는 거의 모든 응용 프로그램은 홈 디렉토리에 설치 될 수 있습니다.
Kusalananda

35

tmux 및 screen에 대한 권장 사항은 모두 좋은 제안입니다. 그들은 귀하의 질문에 대한 답변을 암시하지만 실제로 진술하지는 않습니다. 질문에 대한 답은 방법이 없습니다. ssh를 통해 로그인하면 연결이 끊어지면 쉘이 종료됩니다. 해결 방법은 로그인하여 어떤 종류의 가상 터미널 (예 :)을 즉시 시작하는 것 tmux입니다. 연결이 끊어지면 사용자의 쉘이 종료되지만 새 쉘을 열고 가상 터미널 (실제로 작업중인 쉘을 실행중인)에 다시 연결할 수 있습니다.


승인. 분명하다.

yum 프로세스가 여전히 실행 중이라고 가정하면 (쉘이 SIGHUP을 받았을 때 즉시 종료되지 않음) reptyr 또는 이와 유사한 프로세스는 프로세스를 복구하거나 향후 실패 할 경우 충분할 있습니다. 그러나 쉘은 일반적으로 연결이 끊어지면 종료됩니다.
Eroen

@Eroen tmux를 사용하더라도 연결이 끊어지면 OS가 tmux 프로세스를 종료한다는 의미입니까?
Dojo

@Dojo 연결이 종료되면 tmux 인스턴스는 중지되지만 tmux 세션 (및 관리하는 셸)은 유지됩니다.
William Pursell

예를 들어 갑자기 실수로 RJ-45 케이블을 뽑았 기 때문에 원격 ssh 서버와의 연결이 끊어지면 ssh 서버는 미리 정의 된 시간 초과 (예 : 120 초) 까지이 세션을 계속 유지한다고 생각합니다. 따라서이 경우 케이블을 뽑은 후 120 초 이내에 ssh 서버 측에 여전히 존재하는이 세션을 다시 시작하는 방법이 있습니까?
Gab 是 好人

8

윌리엄이 말했듯이, 짧은 대답은 '아니요'입니다. 이를 방지하기 위해 연결을 끊기 전에 screen 명령을 사용할 수 있습니다


내가 이해 한 바에 따르면, 화면으로 yum을 시작해야했을 것입니다 ... 음, 나는하지 않았습니다. 나는 그것이 여전히 사용 중이라고 yum을 다시 실행할 수 없으며 강제로 죽이고 싶지 않습니다. .. 달리는 m의 제어권을 어떻게 되 찾을 수 있습니까?

및 byobu 화면에 좋은 보완, 그것은 자동으로 멋진 그래픽 터미널에서 시작하세요 launchpad.net/byobu

내가 아는 한 yum 명령의 출력을 현재 용어 세션으로 리디렉션하는 숨겨진 방법이 없지만 내 머리 꼭대기에서 생각할 수는 없습니다.
Nicholas Smith

디버거 & c를 사용하여 이것에 대한 많은 부분 솔루션이 있습니다. 프로세스에 새로운 상위 쉘을 제공합니다. Reptyr 은 하나이며 블로그 게시물 은 문제, 해결 방법 및 기타 구현에 대해 설명합니다.
Eroen

3

아니요, 연결을 끊은 후에는 셸을 복구 할 수 없습니다. 대신, 연결을 끊은 후에도 실행중인 명령이 계속 실행되도록해야합니다.

이를 위해 대부분의 쉘에 내장 된 명령 인 "nohup"및 "disown"명령을 사용하십시오. 즉, 아무것도 설치할 필요가 없습니다. 이것은 비 대화식 명령에서만 작동합니다.

따라서 단계는 다음과 같습니다.

  1. 서버에 로그인
  2. "nohup sudo yum update &"명령을 실행하십시오 (현재 디렉토리의 모든 출력을 nohup.out 파일에 기록합니다)
  3. "Disown % 1"실행
  4. 이 시점에서 연결을 끊거나 연결이 끊길 때까지 기다리십시오. :)

서버로 돌아 왔을 때 "tail nohup.out"을 사용하여 명령이 어떻게 수행되는지 확인하십시오.


일반적인 경우에는 이것이 제대로 작동하지 않습니까? 예를 들어, 한 번에 입력을 원하는 명령의 경우 ... 비 대화식 명령의 경우, 충분히 작동하고 터미널 멀티플렉서의 오버 헤드 (및 설치가 필요할 수 있음)를 피할 수 있습니다.
CVn

예, 명령이 사용자 입력을 원하지 않는 경우에만 작동합니다. 대답을 업데이트했습니다. 전반적으로 터미널 멀티플렉서가 확실한 방법이지만 추가 도구를 설치할 수는 없다고 언급했습니다.
zygis

당연히, 그것은 유효한 답변이며 가능한 사용 사례에서는 약간 제한되어 있습니다. 수정 사항으로 상향 조정되었습니다.
CVn

3

누군가가 답변 대신 의견에 reptyr을 추가하여 의견을 표명 할 수는 없지만 편집 된 질문에 대한 좋은 답변 인 것처럼 보이고 CentOS에서 훌륭하게 작동했습니다.

참조 : https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

다시 연결 한 후 중단 된 세션을 복구 할 수있는 방법이 있습니까?

편집 : yum으로 일부 업데이트 및 설치를 수행 중이며 프로세스가 진행중인 작업의 중간에 프로세스가 계속 중단되면 이것이 문제가 될 수 있습니다.

마찬가지로, yum 업데이트 세션에 대한 원격 연결이 끊어졌습니다. 그래서이 질문을 검색하고 발견했습니다 ... 이번에는 다시 연결하고 화면을 사용했습니다.

  1. ssh를 다시 연결
  2. 화면
  3. 위의 링크에 따라 reptyr를 설치하십시오
  4. ps -a | 그렙 m
  5. reptyr PSID

거기에서 나는 yum이 몇 시간 전에했던 회복 된 프롬프트에 있습니다.

기술적으로 대답은 모두 정확합니다. 이것은 정지 된 세션을 복구하는 것이 아니며 고아 프로세스를 현재 세션으로 다시 만드는 것입니다. 매우 유용합니다 ...


1

많은 사람들이 제안대로 screen하고 tmux, 그들이 모두 지원 기본 기능을하지만, 하나 하나가 모든 경우에 다른 뛰어난 것을 말할 수 있도록, 서로 다른 고유의 기능을 가지고 있습니다. 예를 들어, tmux 만 Window-splitting을 지원 하는 반면 GNU 화면 만 (Ctrl + ar)를 사용하여 긴 줄 바꿈 을 토글 할 수 있습니다 . 보다 자세한 비교는 여기를 참조 하십시오 .

ssh 의이 문제를 해결하기 위해 특별히 도구가 있습니다.

Autossh 는 ssh의 사본을 시작하고 모니터링하는 프로그램으로, 트래픽없어지 거나 중지되는 경우 필요에 따라 다시 시작합니다. 아이디어는 rstunnel에서 온 것입니다.

Mosh 는 로밍을 허용하고 간헐적 인 연결을 지원하며 사용자 키 입력의 지능적인 로컬 에코 및 라인 편집 기능을 제공하는 원격 터미널 응용 프로그램입니다. Mosh는 SSH를 대체합니다. 특히 Wi-Fi, 셀룰러 및 장거리 링크를 통해 더욱 강력하고 반응이 좋습니다.


-1

tmux쉘을 사용하여 수행 할 수 있습니다 . 세션을 다시 연결하는 가장 빠른 방법은 연결이 끊어진 경우 다음과 같습니다.

tmux a #0

이것은 허용 된 답변이 말하지 않은 것을 추가합니다. 또한 사용자가 이미 tmux세션을 실행 하고 있다고 가정합니다 .
Kusalananda

2
이것은 그 대답에 주석이 "당신은 생략 할 말을 할 수 attacha."
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.