IT story

분리 된 mosh 세션에 어떻게 다시 연결합니까?

hot-time 2020. 6. 14. 09:50
반응형

분리 된 mosh 세션에 어떻게 다시 연결합니까?


분리 된 mosh 세션에 다시 연결하거나 제거하는 방법

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).

즉, mosh와 동등한 것은 무엇입니까?

screen -D -R

또는 가능

screen -wipe

또한이 답변은 설명서에서 어디서 찾을 수 있습니까?


보안상의 이유로 다시 연결할 수 없습니다 ( https://github.com/keithw/mosh/issues/394 참조)

분리 된 세션을 종료하려면 해당 메시지에 표시된 PID 번호 ( 'XXXX'부분)를 사용하십시오. 예를 들어-

Mosh: You have a detached Mosh session on this server (mosh [12345]).

그리고이 명령을 실행할 수 있습니다

kill 12345

또한 모든 mosh 연결 을 닫으 려면 다음을 수행하십시오.

kill `pidof mosh-server`

현재 mosh를 통해 연결되어있는 경우이 마지막 명령도 연결을 끊습니다.


놀랍게도 CRIU ( https://criu.org )를 사용 하여 mosh 클라이언트를 검사 점으로 시작하고 다시 시작했습니다.

충격적인.

mosh-client의 PID를 찾으십시오.

$ ps -ef | Grep Mosh

그런 다음 지시에 따라 CRIU를 설치하십시오.

그런 다음 체크 포인트를 다음과 같이하십시오.

$ mkdir 체크 포인트

$ sudo ./criu dump -D 검사 점 -t PID --shell-job

그런 다음 복원하십시오.

$ sudo ./criu restore -D 검사 점 --shell-job

그리고 거기에 있습니다. mosh 클라이언트가 돌아 왔습니다.

그러나 노트북을 재부팅하면 (우리가 보호하려는 모든 요점) mosh는 monotonic시계를 사용 하여 클라이언트 쪽의 시간을 추적 하므로 재부팅 중에는 작동하지 않습니다. 그러나 작동하지 않습니다. 랩탑이 갑자기 튀어 나오면 mosh 시퀀스 번호가 체크 포인트 된 버전과 동기화되지 않기 때문에 작동하지 않습니다 (바이너리는 재개되지만 통신은 중단됨).

이 문제를 해결하려면 mosh에 중지하고 mosh 소스 코드를 다운로드하도록 지시해야합니다. 그런 다음이 파일을 편집하십시오.

cd mosh

vim configure.ac

그런 다음 GETTIME해당 줄을 검색 하고 주석 처리하십시오.

그런 다음 수행하십시오.

autoreconf # 또는 ./autogen.sh를 처음 복제 한 경우

./configure

하다

설치하다

그 후에 CRIU 체크 포인트 mosh 클라이언트 세션은 재부팅 후에도 유지됩니다.

(물론 체크 포인트를 유용하게 사용할 수있을 정도로 정기적으로 수행하기 위해 무언가를 작성해야 할 것입니다. 그러나 그것은 독자를위한 연습입니다).


나는 이것이 오래된 게시물이라는 것을 알고 있지만, mosh 저자 인 Keith Winstein이 제안한 것처럼 여기에 매우 간단한 해결책이 있습니다 : https://github.com/mobile-shell/mosh/issues/394

"먼저 여러 클라이언트에서 세션에 연결하려면 (또는 클라이언트가 사망 한 후) screen 또는 tmux를 사용해야합니다. Mosh는 화면이 아닌 SSH를 대체합니다 (일부 경우). 많은 Mosh 사용자는 화면과 함께 사용하고 그렇게 좋아합니다. "

시나리오 : mosh를 통해 원격 서버에 로그인했습니다. 그런 다음 화면을 실행하고 화면 세션에서 프로세스를 실행했습니다 (예 : htop). 연결이 끊어졌습니다 (노트북 배터리가 죽거나 네트워크 연결이 끊어지는 등). mosh를 통해 다시 연결하고 서버에서 해당 메시지를받습니다.

Mosh :이 서버에서 Mosh 세션이 분리되었습니다 (mosh [XXXX]).

내가해야 할 일은 이전 mosh 세션을 종료하는 것입니다

XXXX를 죽이십시오

그리고 여전히 존재 화면 세션에 다시 연결합니다 .

화면 -r

이제 htop (또는 실행중인 프로세스)이 중단없이 다시 돌아옵니다. 이는 갑자기 중단 될 경우 서버를 지저분한 알 수없는 상태로 유지하는 업그레이드 또는 기타 프로세스를 실행하는 데 특히 유용합니다. 나는 그것을 시도하지 않았지만 tmux로 동일한 작업을 수행 할 수 있다고 가정합니다. 나는 이것이 Annihilannic과 eskhool이 제안한 것이라고 믿는다.


Varta의 답변 외에도 다음 명령을 사용하여 현재 연결을 제외한 모든 mosh 연결을 닫습니다.

pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill


@varta가 지적했듯이 mosh 소유자는 보안상의 이유로 다른 클라이언트에서 다시 연결하는 것에 매우 반대합니다. 따라서 클라이언트가 종료 된 경우 (예 : 랩톱을 다시 시작한 경우) 유일한 옵션은 세션을 종료하는 것입니다.

분리 된 세션 만 죽이려면 다음 줄을 사용할 수 있습니다 (내 별칭으로 사용 .bashrc).

who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill

That command depends on the fact that who lists connected users including mosh sessions, only attached mosh sessions have "via mosh", and that mosh sessions have their pid in square brackets. So it finds the pids for just the detached mosh sessions and passes them to kill using xargs.

Here is an example who result for reference:

$ who
theuser    pts/32       2018-01-03 08:39 (17X.XX.248.9 via mosh [193891])
theuser    pts/17       2018-01-03 08:31 (17X.XX.248.9 via mosh [187483])
theuser    pts/21       2018-01-02 18:52 (mosh [205286])
theuser    pts/44       2017-12-21 13:58 (:1001.0)

An alternative is to use the mosh-server environment variable MOSH_SERVER_SIGNAL_TMOUT. You can set it to something like 300 in your .bashrc on the server side. Then if you do a pkill -SIGUSER1 mosh-server it will only kill mosh-servers that have not been connected in the last 300 seconds (the others will ignore the SIGUSER1). More info in the mosh-server man page. I am using the command above because, once aliased, it seems simpler to me.

Note, as mentioned by @Annihilannic, if you are using tmux/screen inside your mosh sessions then those tmux/screen sessions are still around after you kill the mosh sessions. So you can still attach to them (so you really don't lose much by killing the mosh sessions themselves).


The answers here claiming that killing mosh-server is the only option are largely obsolete, as we can use criu and reptyr to recover and reattach arbitrary processes.

Not to mention that nowadays we can kill -USR1 mosh-server to only kill detached sessions in a clean and safe way, without resorting to unsafe who output or cumbersome commands to avoid killing our own session.

Next to the criu answer from Michael R. Hines, there is the slightly more "light-weight" reptyr which can be used to reattach processes started by mosh-server (i.e. not the mosh-server itself). I typically use

pstree -p <mosh-server PID>

to list the tree of processes under the detached mosh-server, and then

reptyr PID

to reattach the desired process to my current terminal. After repeating the procedure for all processes I care about, I

kill -USR1 <mosh-server PID>

whereas I take care to only kill sessions I know are mine (shared system).


Use ps command for getting the list of running task or use ps -ef | grep mosh

Kill the mosh PID using this command:

kill <pid>

Also, to close all mosh connections you can:

Note that if you are currently connected via mosh, then this also disconnect you

kill `pidof mosh-server`

참고URL : https://stackoverflow.com/questions/17857733/how-do-i-reattach-to-a-detached-mosh-session

반응형