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


157

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

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

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

screen -D -R

또는 가능

screen -wipe

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

답변:


197

보안상의 이유로 다시 연결할 수 없습니다 ( 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를 통해 연결되어있는 경우이 마지막 명령도 연결을 끊습니다.


34
@artfulrobot 분리 된 세션이 여전히 어딘가에있는 mosh-client에 속할 가능성이 있기 때문입니다. Mosh 세션은 로밍하고 일시 중단 / 다시 시작 (예 :“최대 절전 모드”)주기를 통해 생존 할 수 있습니다. mosh가 해결할 수없는 문제는 클라이언트 시스템이 mosh 세션을 정상적으로 종료하지 않고 다시 시작되었음을 감지하는 것입니다.
binki

7
killall mosh-server대신 하지 말아야 할 이유가 있습니까? 특히 pidof와 killall은 실제로 동일합니다.
Jordan

6
@Jordan : 일부 시스템 (예 : Solaris) killall에서는 정확히 말한대로 수행합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

4
mosh를 통해 연결되어 있고 실행 killall mosh-server하면 연결이 끊어집니다.
0xcaff

1
@ 0xcaff 만약 당신이 mosh를 통해 연결하고 실행 kill `pidof mosh-server`하면 당신은 똑같이 분리 될 것입니다
David

26

놀랍게도 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 클라이언트 세션은 재부팅 후에도 유지됩니다.

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


1
복원 후 화면의 출력을 새로 고치려면 'CTRL-L'을 입력하십시오.
Michael Galaxy

6
호기심으로 인해 내가 빠진 mosh 클라이언트 세션을 복원하면 실질적인 이점이 있습니까? 나는 mosh에서 tmux를 실행하고 클라이언트에서 mosh를 다시 시작하고 tmux를 다시 연결할 수 있습니다 ... 멋진 것 이외의 다른 이점이 있습니까?
eskhool

1
긴 대답 : github.com/mobile-shell/mosh/issues/394 짧은 대답은 그렇습니다. mosh-server 데몬이 대상 서버에서 이미 실행중인 경우 tmux 세션이 필요하지 않습니다. 그것은 매달려있는 mosh 데몬을 떠날뿐만 아니라 우리가 처음에 입력 할 필요가없는 또 다른 키 입력 세트를 남겨 둡니다.
Michael Galaxy

1
Mosh는 화면이 아닌 SSH를 대체합니다 (일부 경우). github의 quoth keithw (mosh author)
törzsmókus

19

나는 이것이 오래된 게시물이라는 것을 알고 있지만, 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이 제안한 것이라고 믿는다.


2
이것은 좋은 대답입니다. 고맙습니다. 그렇습니다 .tmux와 동일하게 작동한다는 것을 확인했습니다.
laughing_man

10

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

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


오래된 mosh 세션이없는 경우 xkill에서 오류가 발생합니다. 더 나은 사용pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77 11:11

4

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

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

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

이 명령은 whomosh 세션을 포함하여 연결된 사용자 를 나열하고 연결된 mosh 세션에만 "via mosh"가 있으며 mosh 세션에는 대괄호 안에 pid가 있다는 사실에 따라 다릅니다 . 따라서 분리 된 mosh 세션에 대한 pid를 찾아 xargs를 사용하여 죽 이도록 전달합니다.

다음은 who참조 결과 의 예 입니다.

$ 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)

대안은 mosh-server 환경 변수를 사용하는 것 MOSH_SERVER_SIGNAL_TMOUT입니다. 당신은 당신의 300 같은으로 설정할 수 있습니다 .bashrc상의 서버 측 . 그런 다음 pkill -SIGUSER1 mosh-server마지막 300 초 동안 연결되지 않은 mosh 서버 만 죽입니다 (다른 서버는 SIGUSER1을 무시합니다). mosh-server 매뉴얼 페이지 에 자세한 정보가 있습니다. 별칭이 지정되면 나에게 더 단순 해 보이기 때문에 위의 명령을 사용하고 있습니다.

@Annihilannic에서 언급했듯이 mosh 세션 내에서 tmux / screen을 사용하는 경우 mosh 세션을 종료 한 후에도 해당 tmux / screen 세션이 계속 남아 있습니다. 따라서 여전히 첨부 할 수 있습니다 (따라서 mosh 세션 자체를 죽여서 많이 잃지 않습니다).


3

여기에서 임의의 프로세스를 mosh-server사용 criu하고 reptyr복구하고 다시 연결할 수 있기 때문에 킬링 이 유일한 옵션 이라고 주장하는 대답 은 대체로 쓸모가 없습니다 .

말할 것도없이 오늘날 우리 자신의 세션이 종료되지 않도록하기 위해 kill -USR1 mosh-server안전하지 않은 who출력이나 성가신 명령을 사용 하지 않고 분리 된 세션 만 깨끗하고 안전한 방식으로 종료 할 수 있습니다.

criuMichael R. Hines 의 답변 옆 에는 약간 더 가벼운 (light-weight ) 것이 있는데, 이는 그 자체로 reptyr시작되는 프로세스를 다시 첨부하는 데 사용될 수 있습니다 . 나는 보통mosh-servermosh-server

pstree -p <mosh-server PID>

분리 된 mosh-server 아래에 프로세스 트리를 나열한 다음

reptyr PID

원하는 프로세스를 현재 터미널에 다시 연결합니다. 관심있는 모든 프로세스에 대해 절차를 반복 한 후

kill -USR1 <mosh-server PID>

반면 나는 내가 알고있는 세션 만 죽 이도록 돌보아줍니다 (공유 시스템).


나는 다음을 얻는다Unable to attach to pid 10103: Permission denied
rubo77

-1

ps 명령을 사용 하여 실행중인 작업 목록을 얻거나 사용하십시오. ps -ef | Grep Mosh

이 명령을 사용하여 mosh PID를 종료하십시오.

kill <pid>

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

현재 mosh를 통해 연결되어 있으면 연결이 끊어집니다.

kill `pidof mosh-server`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.