이 질문을 읽으면 궁금해졌습니다. screen사용 중이 아니라고 가정합니다 . 어떤 이유로 든 Linux 대상에서 SSH 세션이 삭제되고 시간 초과로 인해 서버가 세션을 종료하기 전에 다시 연결하는 경우 세션이 손상되어 중단되지 않도록 실행중인 명령에 대한 제어권을 다시 확보 할 수 있습니다 ?
이 질문을 읽으면 궁금해졌습니다. screen사용 중이 아니라고 가정합니다 . 어떤 이유로 든 Linux 대상에서 SSH 세션이 삭제되고 시간 초과로 인해 서버가 세션을 종료하기 전에 다시 연결하는 경우 세션이 손상되어 중단되지 않도록 실행중인 명령에 대한 제어권을 다시 확보 할 수 있습니다 ?
답변:
새 터미널의 현재 STD * 파일 디스크립터를 이전 실행 프로세스에 연결하려고하면 문제가 발생합니다. 그렇게하더라도 터미널의 작업 제어는 예상대로 작동하지 않습니다. 인계 된 프로그램을 종료하고 파일 디스크립터를 희생하여 새로 백그라운드 프로세스에 전달 된 쉘에 어떤 일이 발생하면 엉망이됩니다. 쉘이 사라지면 ssh가 계속 열려 있습니까? 아마 아닙니다. 따라서 먼저 다른 곳으로 리디렉션해야합니다.
가능 여부에 관계없이 포기한 프로세스를 "자연스럽게"죽이는 것이 더 바람직하다는 결론을 내 렸습니다. 당신은 아무것도 중요한 충분히하고 있다면 모든 해커을하려고 정당화 제어를 다시 시작해야하는 과 가 불안정 링크에있어, 당신은 아마 사전 그냥 사용 화면 (또는 VNC에서 것을 알아야한다, 또는 무엇이든은 detached- 수레 컨트롤 보트). :)
나는 이것이 오래된 질문이라는 것을 알고 있지만 다른 사람이 내가했던 것처럼 이것을 발견 할 경우를 대비하여 내 발견 사항을 추가하는 것이 중요하다고 느꼈습니다.
나는이 일을하는 데 특별한 결과를 보지 못했지만 이것이 내가 사용한 것이며 놀랍게 작동했습니다. 때로는 서버에서 긴 프로세스를 실행할 때 때때로 ssh 세션의 연결이 끊어집니다. tty 세션과 함께 프로세스가 계속 실행중인 것으로 보이지만 다시 연결할 수는 없습니다. 프로세스를 새로 연결된 세션으로 가져 오는 아래 프로그램을 찾았습니다.
https://github.com/nelhage/reptyr
더 많은 정보가 있습니다
일반적으로이를 처리하는 올바른 방법은 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는 자동으로 부인 종료에 백그라운드 프로세스를 (기본적으로 해제 huponexit 와 shopt 내부를 ). 포 그라운드 프로세스에서는 nohup 을 사용해야 합니다.
아마 아닙니다. 나는 그것이 불가능하다는 것을 보장 할 수는 없지만 정말로 의심합니다.
하나는 쉘을 죽이지 않고 ssh 연결 종료의 결과로 실행 가능한 명령이 없다는 것입니다. 이것은 어렵지 않습니다. 다른 질문에서 언급 한 것과 같은 nohup 및 유사한 메커니즘을 사용할 수 있어야합니다.
그러나 시작한 후에 ssh somehost nuhup vim /some/file연결이 끊어 졌다고 가정 하십시오. ssh somehost다시 로그인하기 위해 실행 하면 vim 프로세스가 여전히 실행 중임을 알 수 있습니다. 그러나 어떻게 그 프로세스에 다시 연결합니까? 대화식 forground 프로세스에는 제어 tty가 있으며 vim 프로세스가 시작된 후 닫 혔을 때 열려 있습니다. 새 쉘에서 다시 "다시 여는"방법이 있는지 확실하지 않습니다 (한 쉘에서 여러 백그라운드 작업을 실행하는 것처럼 다른 쉘의 포 그라운드 작업을 포 그라운드 할 수 없음).
Screen이 기능을 갖도록 명시 적으로 작성되었습니다. 시작시 터미널 관리 프로세스와 클라이언트 프로세스의 두 프로세스를 분기합니다. 상호 작용은 클라이언트 <-> 터미널 관리자 <-> 응용 프로그램이며 연결을 끊거나 연결을 끊으면 터미널 관리자가 계속 작동하는 동안 클라이언트 프로세스가 종료됩니다. 화면은 나중에 다시 터미널 관리 프로세스에 연결할 수 있도록 특정 지원을 제공하며 이것이 일반적인 경우에는 가능하지 않다고 생각합니다.
세션 이 삭제 되면 TTL이 이미 만료되었음을 의미하므로 더 이상 tty가 없습니다. 그러나 네트워크 연결이 중단되면 SSH 세션을 중단하지 않아도되며 연결을 다시 시작하고 계속 진행할 수 있습니다. 그게 당신이 요구하는 것입니까?
이 질문 에 해키 tty 도둑질 코드에 대한 링크가있었습니다 . 이론적으로이 기능을 사용하여 nohup 프로세스를 다시 제어 할 수 있어야합니다.