Làm thế nào để tôi gắn lại một phiên mosh tách ra?


157

Làm thế nào để tôi gắn lại vào một phiên mosh tách ra hoặc nếu không thì thoát khỏi

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

tức là những gì tương đương với mosh

screen -D -R

hoặc có thể

screen -wipe

Hơn nữa, câu trả lời này có thể được tìm thấy trong tài liệu ở đâu?

Câu trả lời:


197

Vì lý do bảo mật, bạn không thể gắn lại, hãy xem https://github.com/keithw/mosh/issues/394

Để hủy phiên tách ra, hãy sử dụng số PID được hiển thị trong thông báo đó (đó là phần 'XXXX'.) Ví dụ: nếu bạn thấy -

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

Và có thể chạy lệnh này:

kill 12345

Ngoài ra, để đóng tất cả các kết nối mosh bạn có thể:

kill `pidof mosh-server`

Lưu ý rằng nếu bạn hiện đang được kết nối qua mosh, lệnh cuối cùng này cũng sẽ ngắt kết nối bạn.


34
@artfulrobot Bởi vì có khả năng phiên tách ra thuộc về một khách hàng vẫn còn sống ở đâu đó. Các phiên Mosh đi lang thang và có thể tồn tại thông qua chu kỳ đình chỉ / tiếp tục (ví dụ: chu kỳ Hibernation hộ). Vấn đề mosh không (và không thể dễ dàng) giải quyết là phát hiện ra rằng máy khách đã khởi động lại mà không duyên dáng đóng phiên mosh.
biley

7
Có một lý do để không killall mosh-serverthay thế? Đặc biệt là vì pidof và killall dù sao cũng thực sự giống nhau.
Jordan

6
@Jordan: Trên một số hệ thống (ví dụ Solaris), killallthực hiện chính xác những gì nó nói.
Tạm dừng cho đến khi có thông báo mới.

4
Nếu bạn được kết nối qua mosh và bạn chạy, killall mosh-serverbạn sẽ bị ngắt kết nối.
0xcaff

1
@ 0xcaff nếu bạn kết nối qua mosh và chạy, kill `pidof mosh-server`bạn sẽ bị tách ra giống nhau
David

26

Trước sự ngạc nhiên của tôi, tôi đã sử dụng CRIU ( https://criu.org ) để kiểm tra và khởi động lại máy khách mosh và nó đã hoạt động.

Gây sốc.

Tìm bộ vi xử lý mosh-client của bạn:

$ ps -ef | grep mosh

Sau đó, cài đặt CRIU theo hướng dẫn của họ.

Sau đó, kiểm tra nó như thế này:

$ mkdir điểm kiểm tra

$ sudo ./criu dump -D điểm kiểm tra -t PID - công việc

Sau đó, khôi phục nó:

$ sudo ./criu khôi phục -D điểm kiểm tra - công việc

Và, nó đây rồi. Khách hàng mosh của bạn đã trở lại.

Tuy nhiên, một điều cần lưu ý là nếu máy tính xách tay của bạn khởi động lại (đó là toàn bộ vấn đề chúng tôi đang cố gắng bảo vệ), mosh sử dụng monotonicđồng hồ để theo dõi thời gian ở phía máy khách, không hoạt động trong quá trình khởi động lại. Tuy nhiên, điều này sẽ KHÔNG hoạt động, nếu máy tính xách tay của bạn gặp sự cố, nó sẽ không hoạt động vì số thứ tự mosh sẽ không đồng bộ với phiên bản đã được kiểm tra (nhị phân sẽ tiếp tục, nhưng giao tiếp sẽ dừng).

Để khắc phục điều này, bạn cần nói với mosh ngừng làm điều đó và tải xuống mã nguồn mosh. Sau đó, chỉnh sửa tệp này:

cd mosh

vim configure.ac

Sau đó, tìm kiếm GETTIMEvà bình luận ra dòng đó.

Sau đó làm:

autoreconf # hoặc ./autogen.sh nếu bạn mới nhân bản nó lần đầu tiên

./mình

làm

cài đặt

Sau đó, các phiên máy khách mosh được kiểm tra CRIU của bạn sẽ tồn tại khi khởi động lại.

(Rõ ràng là bạn cần phải viết một cái gì đó để thực hiện các điểm kiểm tra thường xuyên đủ để có ích. Nhưng, đó là một bài tập cho người đọc).


1
Đảm bảo nhập 'CTRL-L' để làm mới đầu ra của màn hình sau khi khôi phục.
Michael Galaxy

6
Vì tò mò, có một lợi ích thiết thực nào trong việc khôi phục phiên khách hàng mosh mà tôi đang thiếu? Tôi chạy tmux trên mosh và chỉ có thể khởi chạy lại mosh trên máy khách và kết nối lại tmux ... có lợi ích gì khi làm điều này ngoài việc tuyệt vời của nó (mà nó thực sự là như vậy!)?
eskhool

1
Câu trả lời dài: github.com/mobile-shell/mosh/issues/394 Câu trả lời ngắn gọn là, có: Người ta không cần phiên tmux nếu trình nền mosh-server đã chạy trên máy chủ đích. Nó không chỉ để lại những con ma mướp lủng lẳng nằm xung quanh, mà còn là một tổ hợp phím khác mà chúng ta không nên gõ ở vị trí đầu tiên.
Michael Galaxy

1
Mosh là một sự thay thế (trong một số trường hợp) cho SSH, không phải cho màn hình. quoth keithw (tác giả mosh) trên github
törzsmókus

19

Tôi nhận ra đây là một bài viết cũ, nhưng có một giải pháp rất đơn giản cho vấn đề này, như đề xuất của Keith Winstein, tác giả mosh, tại đây: https://github.com/mobile-shell/mosh/issues/394

"Chà, trước tiên, nếu bạn muốn có khả năng đính kèm vào một phiên từ nhiều máy khách (hoặc sau khi máy khách chết), bạn nên sử dụng màn hình hoặc tmux. Mosh là một thay thế (trong một số trường hợp) cho SSH, không phải cho màn hình. Nhiều người dùng Mosh sử dụng nó cùng với màn hình và thích nó theo cách đó. "

Kịch bản: Tôi đang đăng nhập vào một máy chủ từ xa thông qua mosh. Sau đó, tôi đã chạy màn hình và có một quá trình đang chạy trong phiên màn hình, ví dụ như htop. Tôi bị mất kết nối (chết pin laptop, mất kết nối mạng, v.v.). Tôi kết nối lại qua mosh và nhận được tin nhắn đó trên máy chủ,

Mosh: Bạn có một phiên Mosh tách rời trên máy chủ này (mosh [XXXX]).

Tất cả những gì tôi phải làm là giết phiên mosh trước

giết XXXX

gắn lại vào phiên màn hình vẫn còn tồn tại .

màn hình -r

Bây giờ, htop (hoặc bất kỳ quá trình nào đang chạy) đã hoạt động trở lại như cũ mà không bị gián đoạn. Điều này đặc biệt hữu ích để chạy nâng cấp hoặc các quy trình khác sẽ khiến máy chủ rơi vào tình trạng lộn xộn, không xác định nếu đột ngột bị gián đoạn. Tôi giả sử bạn có thể làm tương tự với tmux, mặc dù tôi chưa thử. Tôi tin rằng đây là những gì Annihilannic và eskhool đã gợi ý.


2
Đây là một câu trả lời tuyệt vời. Cảm ơn bạn, và vâng tôi đã xác nhận rằng nó hoạt động tương tự với tmux.
laughing_man

10

Ngoài câu trả lời của Varta, tôi sử dụng lệnh sau để đóng tất cả các kết nối mosh ngoại trừ kết nối hiện tại:

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


Trong trường hợp, không có phiên mosh cũ, xkill sẽ đưa ra lỗi. Sử dụng tốt hơnpgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77

4

Như @varta đã chỉ ra, chủ sở hữu mosh rất chống lại việc gắn lại từ các khách hàng khác nhau vì lý do bảo mật. Vì vậy, nếu khách hàng của bạn không còn nữa (ví dụ: bạn đã khởi động lại máy tính xách tay của mình), lựa chọn duy nhất của bạn là giết các phiên.

Để chỉ giết các phiên tách ra, bạn có thể sử dụng dòng sau (mà tôi có là bí danh trong tôi .bashrc).

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

Lệnh đó phụ thuộc vào thực tế là whodanh sách người dùng được kết nối bao gồm các phiên mosh, chỉ các phiên mosh được đính kèm mới có "thông qua mosh" và các phiên mosh đó có pid trong dấu ngoặc vuông. Vì vậy, nó tìm thấy các pids chỉ cho các phiên mosh tách ra và vượt qua chúng để giết bằng xargs.

Đây là một whokết quả ví dụ để tham khảo:

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

Một cách khác là sử dụng biến môi trường mosh-server MOSH_SERVER_SIGNAL_TMOUT. Bạn có thể đặt nó vào một cái gì đó như 300 tại của bạn .bashrctrên phía máy chủ . Sau đó, nếu bạn làm điều pkill -SIGUSER1 mosh-serverđó, nó sẽ chỉ giết các máy chủ mosh chưa được kết nối trong 300 giây qua (những người khác sẽ bỏ qua SIGUSER1). Thêm thông tin trong trang người đàn ông mosh-server . Tôi đang sử dụng lệnh trên bởi vì, một khi bí danh, nó có vẻ đơn giản hơn đối với tôi.

Lưu ý, như được đề cập bởi @Annihilannic, nếu bạn đang sử dụng tmux / màn hình bên trong các phiên mosh của mình thì các phiên tmux / màn hình đó vẫn xuất hiện sau khi bạn giết các phiên mosh. Vì vậy, bạn vẫn có thể gắn bó với chúng (vì vậy bạn thực sự không mất nhiều tiền bằng cách tự giết các phiên mosh).


3

Các câu trả lời ở đây tuyên bố rằng giết chóc mosh-serverlà lựa chọn duy nhất phần lớn đã lỗi thời, vì chúng ta có thể sử dụng criureptyrđể phục hồi và gắn lại các quy trình tùy ý.

Chưa kể rằng ngày nay chúng ta chỉ có thể kill -USR1 mosh-servertiêu diệt các phiên tách rời một cách sạch sẽ và an toàn, mà không dùng đến whođầu ra không an toàn hoặc các lệnh rườm rà để tránh giết phiên của chính chúng ta.

Bên cạnh criucâu trả lời từ Michael R. Hines, có một "trọng lượng nhẹ" hơn một chút reptyrcó thể được sử dụng để gắn lại các quá trình được bắt đầu bởi mosh-server(tức là không phải mosh-serverchính nó). Tôi thường sử dụng

pstree -p <mosh-server PID>

để liệt kê cây quy trình trong máy chủ mosh tách ra, và sau đó

reptyr PID

để gắn lại quá trình mong muốn vào thiết bị đầu cuối hiện tại của tôi. Sau khi lặp lại quy trình cho tất cả các quy trình tôi quan tâm, tôi

kill -USR1 <mosh-server PID>

trong khi tôi cẩn thận chỉ giết các phiên mà tôi biết là của tôi (hệ thống dùng chung).


Tôi nhận đượcUnable to attach to pid 10103: Permission denied
rubo77

-1

Sử dụng lệnh ps để nhận danh sách tác vụ đang chạy hoặc sử dụng ps -ef | grep mosh

Tiêu diệt mosh PID bằng lệnh này:

kill <pid>

Ngoài ra, để đóng tất cả các kết nối mosh bạn có thể:

Lưu ý rằng nếu bạn hiện đang kết nối qua mosh, thì điều này cũng ngắt kết nối bạn

kill `pidof mosh-server`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.