삭제 된 SSH 세션에서 실행중인 명령 재개


32

이 질문을 읽으면 궁금해졌습니다. screen사용 중이 아니라고 가정합니다 . 어떤 이유로 든 Linux 대상에서 SSH 세션이 삭제되고 시간 초과로 인해 서버가 세션을 종료하기 전에 다시 연결하는 경우 세션이 손상되어 중단되지 않도록 실행중인 명령에 대한 제어권을 다시 확보 할 수 있습니다 ?


어떤 명령입니까? 나는 일반적으로 대답이 '아니요'라고 추측하고 있습니다.
davr

특별한 명령은 없으며 일반적인 개념으로 묻습니다.
John Gardeniers

1
tty 세션이 초기화되는 방법에 대한 포괄적 인 이해를 가진 사람이 방법을 알려줄 수 있습니다. 동일한 tty에서 새 세션을 다시 만들고 이전 PPID를 명시 적으로 할당 할 수있는 것처럼 보입니다. 수염 난 닉스 전문가가 와서 우리의 마음을 날려 버릴 때까지 기다리고 있습니다. 그것은 꿈이다.
CarpeNoctem

테더 노트북을 실험하고 이더넷 코드를 뽑으면 어떻게됩니까?
Paul

@ ~ drpaulbrewer-데스크톱 컴퓨터에서 작업 할 때와 동일하게 연결이 끊어집니다. 연결이 끊어지는 방법은 질문과 관련이 없습니다.
John Gardeniers 2012

답변:


13

새 터미널의 현재 STD * 파일 디스크립터를 이전 실행 프로세스에 연결하려고하면 문제가 발생합니다. 그렇게하더라도 터미널의 작업 제어는 예상대로 작동하지 않습니다. 인계 된 프로그램을 종료하고 파일 디스크립터를 희생하여 새로 백그라운드 프로세스에 전달 된 쉘에 어떤 일이 발생하면 엉망이됩니다. 쉘이 사라지면 ssh가 계속 열려 있습니까? 아마 아닙니다. 따라서 먼저 다른 곳으로 리디렉션해야합니다.

가능 여부에 관계없이 포기한 프로세스를 "자연스럽게"죽이는 것이 더 바람직하다는 결론을 내 렸습니다. 당신은 아무것도 중요한 충분히하고 있다면 모든 해커을하려고 정당화 제어를 다시 시작해야하는 가 불안정 링크에있어, 당신은 아마 사전 그냥 사용 화면 (또는 VNC에서 것을 알아야한다, 또는 무엇이든은 detached- 수레 컨트롤 보트). :)


수락 할 답변을 선택하기가 어렵다는 것을 알았습니다.이 시점에서 유권자가 유일하게 답변하기 때문에이 답변을 수락합니다.
John Gardeniers

5

나는 이것이 오래된 질문이라는 것을 알고 있지만 다른 사람이 내가했던 것처럼 이것을 발견 할 경우를 대비하여 내 발견 사항을 추가하는 것이 중요하다고 느꼈습니다.

나는이 일을하는 데 특별한 결과를 보지 못했지만 이것이 내가 사용한 것이며 놀랍게 작동했습니다. 때로는 서버에서 긴 프로세스를 실행할 때 때때로 ssh 세션의 연결이 끊어집니다. tty 세션과 함께 프로세스가 계속 실행중인 것으로 보이지만 다시 연결할 수는 없습니다. 프로세스를 새로 연결된 세션으로 가져 오는 아래 프로그램을 찾았습니다.

https://github.com/nelhage/reptyr

더 많은 정보가 있습니다

https://blog.nelhage.com/2011/02/changing-ctty/


5
서버 결함에 오신 것을 환영합니다! 이것이 이론적으로 질문에 대답 할 수 있지만 여기에 답의 핵심 부분을 포함시키고 참조 할 수있는 링크를 제공하는 것이 바람직 합니다.
EEAA

@ user215086 감사합니다! 놀랍게도 이것은 효과가있었습니다! 잠시 동안 긴 구성 파일을 편집하고 많은 사용자 정의 설정과 신중하게 작성된 주석을 추가했으며 연결이 끊어지면 거의 끝났습니다! "Noooooo !! ..."내가 천장에서 욕설을 외치고 난 후에, 나는 reptyr를 설치했다. 나는 ssh 세션을 바로 복구하여 편집기 안에 남겨두고 몇 가지 작업을 완료하고 저장하고 완료했습니다 !! 우후! reptyr는 굉장합니다.
ColdCold

4

일반적으로이를 처리하는 올바른 방법은 GNU screen또는 bash nohup또는 disown메커니즘을 사용하여 미리 준비하는 것 입니다. 을 사용하는 tcsh경우, 쉘은 비정상적으로 종료 될 때 백그라운드 작업을 제거합니다.

사용하지 screen않지만 disown 메소드 중 하나를 통해 프로세스를 계속 실행 하는 경우 gdb( source ) 를 사용하여 프로세스에 다시 연결하는 것을 가짜로 할 수 있습니다 .

[...] 더러운 해킹으로 프로세스의 stdout / stderr / stdin을 다시 열 수는 없습니다. [...]

그런 다음 gdb를 사용하여 프로세스에 연결하고, call close (0)
call close (1)
call close (2)
call open ( "/ dev / pts / xx", ...)
call dup (0)
dup (0)
분리 호출

이제 상황에 맞게이 프로세스를 조정해야합니다. 난 당신이 관리하지 않은 경우 도움이 될 의심 부인 하는 과정을. 당신이 사용하는 경우 bash, 이 게시물을 참조 만드는 방법에 대한 bash는 자동으로 부인 종료에 백그라운드 프로세스를 (기본적으로 해제 huponexitshopt 내부를 ). 포 그라운드 프로세스에서는 nohup 을 사용해야 합니다.


1

아마 아닙니다. 나는 그것이 불가능하다는 것을 보장 할 수는 없지만 정말로 의심합니다.

하나는 쉘을 죽이지 않고 ssh 연결 종료의 결과로 실행 가능한 명령이 없다는 것입니다. 이것은 어렵지 않습니다. 다른 질문에서 언급 한 것과 같은 nohup 및 유사한 메커니즘을 사용할 수 있어야합니다.

그러나 시작한 후에 ssh somehost nuhup vim /some/file연결이 끊어 졌다고 가정 하십시오. ssh somehost다시 로그인하기 위해 실행 하면 vim 프로세스가 여전히 실행 중임을 알 수 있습니다. 그러나 어떻게 그 프로세스에 다시 연결합니까? 대화식 forground 프로세스에는 제어 tty가 있으며 vim 프로세스가 시작된 후 닫 혔을 때 열려 있습니다. 새 쉘에서 다시 "다시 여는"방법이 있는지 확실하지 않습니다 (한 쉘에서 여러 백그라운드 작업을 실행하는 것처럼 다른 쉘의 포 그라운드 작업을 포 그라운드 할 수 없음).

Screen이 기능을 갖도록 명시 적으로 작성되었습니다. 시작시 터미널 관리 프로세스와 클라이언트 프로세스의 두 프로세스를 분기합니다. 상호 작용은 클라이언트 <-> 터미널 관리자 <-> 응용 프로그램이며 연결을 끊거나 연결을 끊으면 터미널 관리자가 계속 작동하는 동안 클라이언트 프로세스가 종료됩니다. 화면은 나중에 다시 터미널 관리 프로세스에 연결할 수 있도록 특정 지원을 제공하며 이것이 일반적인 경우에는 가능하지 않다고 생각합니다.


감사. 그것은 내가 기대했던 것과 거의 같습니다. 누군가 우리를 잘못 증명할 수 있는지 봅시다. ;)
John Gardeniers 2012

나는이 답변을 작성한 이후 "재검사"프로세스를위한 프로그램 담당자 가 있다는 것을 배웠다 . 따라서 이론적으로는 가능하지만 전체적인 대답은 아닐 것입니다.
hlovdal


1

세션 이 삭제 되면 TTL이 이미 만료되었음을 의미하므로 더 이상 tty가 없습니다. 그러나 네트워크 연결이 중단되면 SSH 세션을 중단하지 않아도되며 연결을 다시 시작하고 계속 진행할 수 있습니다. 그게 당신이 요구하는 것입니까?


나는 일반적으로 묻고 있지만 네트워크 문제로 인해 연결이 끊어 질 때 가장 관심이 있습니다. 전반적으로, 나는 그것이 너무 좋아 보이지 않는다고 말하고 싶습니다. 그럼에도 불구하고 이것은 필요보다는 호기심으로 만 요청되었습니다. 답을 찾기 전에 항상 답을 아는 것이 좋습니다. ;)
John Gardeniers 2013

끊어진 연결은 단순한 개념이 아닙니다. 여러 단계를 경험할 수 있습니다. 예를 들어, 네트워크 케이블을 분리하고 몇 초 후에 다시 연결하면 SSH 세션이 계속 유지되므로 초기 지연이 짧더라도 계속 연결하기 위해 다시 연결할 필요는 없습니다. ssh 세션이 종료 된 것으로 판단되면 무언가 잘못 구성되었거나 (또는 ​​이러한 종류의 중단을 지원하도록 올바르게 구성되지 않은) 것입니다.
monomyth

0

이 질문 에 해키 tty 도둑질 코드에 대한 링크가있었습니다 . 이론적으로이 기능을 사용하여 nohup 프로세스를 다시 제어 할 수 있어야합니다.


1
그 질문에 대한 답변에서 언급 된 disown 명령도 더 조사 할 가치가 있습니다. 감사.
John Gardeniers 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.