2013-07-25 24 views

Trả lời

133

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

Để giết phiên tách ra, sử dụng số PID hiển thị trong thông báo đó (đó là một phần của '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 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.

+7

tự hỏi tại sao Mosh không chỉ tự mình giết nó thay vì đưa ra cảnh báo ... – artfulrobot

+27

@artfulrobot Vì có cơ hội là phiên tách ra thuộc về một khách hàng thân thiết 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 việc tạm ngưng/tiếp tục (ví dụ: chu kỳ "Ngủ đông"). 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 cần đóng phiên mosh một cách duyên dáng. – binki

+7

Có lý do nào để không 'killall mosh-server' thay thế? Đặc biệt là kể từ khi pidof và killall thực sự là cùng một điều. – Jordan

0

Tôi sử dụng mosh kết hợp với tmux trên máy chủ để đảm bảo phiên của tôi vẫn tồn tại trong trường hợp khách hàng chết do một số lý do, ví dụ: khởi động lại bắt buộc.

P.S. hoặc bạn có thể tiếp tục sử dụng màn hình, nếu đó là sở thích của bạn.

+2

tmux so với màn hình không có gì để làm với điều này. Tôi sử dụng tmux là tốt, và nhận được cùng một vấn đề này với mosh. –

18

Ngạc nhiên thay, tôi đã sử dụng CRIU (https://criu.org) đến điểm 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 PID mosh-client của bạn:

$ ps-ef | grep mosh

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

Sau đó, trạm kiểm soát nó như thế này:

$ mkdir trạm kiểm soát

$ sudo ./criu đổ -D trạm kiểm soát -t PID --shell-job

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

$ sudo ./criu restore -D checkpoint --shell-job

Và, ở đó. Khách hàng mosh của bạn đã quay lại.Một điều cần lưu ý, tuy nhiên, nếu máy tính của bạn khởi động lại (đó là toàn bộ điểm của những gì chúng tôi đang cố gắng để bảo vệ chống lại), mosh sử dụng một đồng hồ monotonic để theo dõi thời gian ở phía khách hàng, mà doesn ' t làm việc trên khởi động lại. Điều này sẽ không hoạt động, tuy nhiên, nếu máy tính xách tay của bạn chỉ phẳng ra tai nạn 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 thông tin liên lạc sẽ dừng lại).

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

cd Mosh

vim configure.ac

Sau đó, tìm kiếm GETTIME và nhận xét ra dòng đó.

Sau đó làm:

autoreconf # hoặc ./autogen.sh nếu bạn vừa nhân bản nó lần đầu tiên

./configure

làm

make install

Sau đó, dấu kiểm tra CRIU của bạn các phiên khách hàng sẽ tồn tại khi khởi động lại.

(Rõ ràng bạn cần phải viết một cái gì đó để thực hiện các trạm kiểm soát 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. –

+1

Ngoài sự tò mò tuyệt đối, có lợi ích thiết thực nào khi khôi phục phiên khách hàng mosh mà tôi đang thiếu không? 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 khi thực hiện điều này ngoài việc làm mát của nó (mà nó thực sự thực sự là!)? – eskhool

+1

Câu trả lời dài: https://github.com/mobile-shell/mosh/issues/394 Câu trả lời ngắn gọn là, có: Không nên cần phiên tmux nếu daemon mosh-server đang chạy trên máy chủ mục tiêu . Nó không chỉ để lại các daemon mosh lủng lẳng nằm xung quanh, mà còn là một bộ gõ phím khác mà chúng ta không cần phải gõ ở vị trí đầu tiên. –

6

Như một sự bổ sung cho câu trả lời Varta, tôi sử dụng lệnh sau đây để đóng tất cả các kết nối Mosh trừ hiện thời:

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

4

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

"Vâng, trước hết, nếu bạn muốn khả năng để đính kèm vào một phiên làm việc từ nhiều khách hàng (hoặc sau khi khách hàng chết), bạn nên sử dụng màn hình hoặc tmux. ubstitute (trong một số trường hợp) cho SSH, không 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à giống như 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 Tôi đã sau đó 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ụ: Tôi mất kết nối (pin máy tính xách tay chết, mất kết nối mạng, v.v.) Tôi kết nối lại qua mosh và nhận thông báo đó trên máy chủ,

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

Tất cả tôi phải làm là giết phiên Mosh trước

giết XXXX

lắp lại với phiên màn hình, mà 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 đang chạy) đã trở lại chỉ vì nó là không interruption.This đặc biệt hữu ích cho việc chạy nâng cấp hoặc các quá trình khác mà có thể rời khỏi máy chủ trong một trạng thái lộn xộn, không rõ nếu đột nhiên 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 đã không thử nó. Tôi tin rằng đây là những gì Annihilannic và eskhool đã gợi ý.

+0

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

2

Như @varta đã chỉ ra, chủ sở hữu mosh rất chống lại việc kết nối 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 đã biến mất (ví dụ: bạn đã khởi động lại máy tính xách tay), tùy chọn duy nhất của bạn là giết các phiên.

Để chỉ xóa các phiên riêng lẻ, bạn có thể sử dụng dòng sau (mà tôi có làm bí danh trong số .bashrc) của mình.

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

Đó chỉ huy phụ thuộc vào thực tế là who danh sách kết nối với người sử dụng bao gồm cả phiên Mosh, phiên Mosh chỉ kèm theo có "qua Mosh", và rằng phiên Mosh có pid của họ trong dấu ngoặc vuông. Vì vậy, nó tìm thấy các pids cho chỉ các phiên mosh tách ra và vượt qua chúng để giết bằng cách sử dụng xargs.

Dưới đây là một ví dụ who kết quả để 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_SIGNAL_TMOUT. Bạn có thể đặt nó thành một cái gì đó như 300 trong .bashrc của bạn. Sau đó, nếu bạn thực hiện 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ông tin thêm trong số mosh-server man page. Tôi đang sử dụng lệnh trên bởi vì, một khi đã được đặt tên, nó có vẻ đơn giản hơn với tôi.

Lưu ý, như đã đề 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 bạn thì các phiên tmux/màn hình đó vẫn còn xung quanh sau khi bạn giết các phiên mosh. Vì vậy, bạn vẫn có thể đính kèm với họ (vì vậy bạn thực sự không mất nhiều bằng cách giết chết các phiên mosh mình).

Các vấn đề liên quan