답변:
보안상의 이유로 다시 연결할 수 없습니다 ( 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를 통해 연결되어있는 경우이 마지막 명령도 연결을 끊습니다.
killall mosh-server
대신 하지 말아야 할 이유가 있습니까? 특히 pidof와 killall은 실제로 동일합니다.
killall
에서는 정확히 말한대로 수행합니다.
killall mosh-server
하면 연결이 끊어집니다.
kill `pidof mosh-server`
하면 당신은 똑같이 분리 될 것입니다
놀랍게도 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
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
@varta가 지적했듯이 mosh 소유자는 보안상의 이유로 다른 클라이언트에서 다시 연결하는 것에 매우 반대합니다. 따라서 클라이언트가 종료 된 경우 (예 : 랩톱을 다시 시작한 경우) 유일한 옵션은 세션을 종료하는 것입니다.
분리 된 세션 만 죽이려면 다음 줄을 사용할 수 있습니다 (내 별칭으로 사용 .bashrc
).
who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill
이 명령은 who
mosh 세션을 포함하여 연결된 사용자 를 나열하고 연결된 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 세션 자체를 죽여서 많이 잃지 않습니다).
여기에서 임의의 프로세스를 mosh-server
사용 criu
하고 reptyr
복구하고 다시 연결할 수 있기 때문에 킬링 이 유일한 옵션 이라고 주장하는 대답 은 대체로 쓸모가 없습니다 .
말할 것도없이 오늘날 우리 자신의 세션이 종료되지 않도록하기 위해 kill -USR1 mosh-server
안전하지 않은 who
출력이나 성가신 명령을 사용 하지 않고 분리 된 세션 만 깨끗하고 안전한 방식으로 종료 할 수 있습니다.
criu
Michael R. Hines 의 답변 옆 에는 약간 더 가벼운 (light-weight ) 것이 있는데, 이는 그 자체로 reptyr
시작되는 프로세스를 다시 첨부하는 데 사용될 수 있습니다 . 나는 보통mosh-server
mosh-server
pstree -p <mosh-server PID>
분리 된 mosh-server 아래에 프로세스 트리를 나열한 다음
reptyr PID
원하는 프로세스를 현재 터미널에 다시 연결합니다. 관심있는 모든 프로세스에 대해 절차를 반복 한 후
kill -USR1 <mosh-server PID>
반면 나는 내가 알고있는 세션 만 죽 이도록 돌보아줍니다 (공유 시스템).
Unable to attach to pid 10103: Permission denied