Làm thế nào để phục hồi vỏ sau khi ngắt kết nối


37

Đang thực hiện một số công việc trên máy CentOS 5.6 từ xa và mạng của tôi liên tục bị rớt. Có cách nào để tôi có thể phục hồi các phiên treo của mình sau khi kết nối lại không?

EDIT: đang thực hiện một số cập nhật và cài đặt với yum và tôi lo lắng đây có thể là vấn đề nếu các quy trình tiếp tục bị treo giữa bất cứ điều gì họ đang làm.


6
tmux hoặc màn hình.
sehe

Câu trả lời:


63

Không có cách nào, nhưng để ngăn chặn điều này tôi thích sử dụng tmux. Tôi bắt đầu tmux, bắt đầu hoạt động và đi trên con đường của tôi. Nếu tôi quay lại và thấy kết nối đã bị hỏng, tất cả những gì tôi phải làm là kết nối lại và gõ tmux attach.

Đây là một ví dụ.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion

không có tmux và không được phép cài đặt những thứ không có trong danh sách việc cần làm của tôi ...

5
@sergio Tim tôi chảy máu :-)) Sử dụng screen.

4
@sergio Trên hệ thống Unix, hầu như mọi ứng dụng không yêu cầu quyền root để chạy đều có thể được cài đặt trong thư mục chính.
Kusalananda

35

Các khuyến nghị cho tmux và màn hình đều là những gợi ý tốt. Họ ngụ ý câu trả lời cho câu hỏi của bạn, nhưng không thực sự nêu nó. Câu trả lời cho câu hỏi là: không có cách nào. Nếu bạn đăng nhập qua ssh, shell sẽ kết thúc khi kết nối bị rớt. Cách khắc phục là đăng nhập và ngay lập tức khởi động một thiết bị đầu cuối ảo nào đó (chẳng hạn như tmux). Khi kết nối giảm, lớp vỏ bạn đang kết thúc, nhưng bạn có thể mở một lớp vỏ mới và kết nối lại với thiết bị đầu cuối ảo (đang chạy lớp vỏ mà bạn đang thực sự làm việc.)


Được. bây giờ rõ ràng rồi

Giả sử quy trình yum vẫn chạy (không kết thúc ngay lập tức khi trình bao có SIGHUP), reptyr hoặc tương tự thể đủ để khôi phục quy trình hoặc - không thực hiện được - có được bất kỳ đầu ra nào trong tương lai. Vỏ thường sẽ bị chấm dứt khi ngắt kết nối.
Eroen

@Eroen Ý bạn là, ngay cả khi sử dụng tmux, HĐH sẽ chấm dứt quá trình tmux một khi nó thấy rằng kết nối bị mất?
Dojo

@Dojo Khi kết nối bị chấm dứt, phiên bản tmux sẽ bị dừng, nhưng phiên tmux (và các shell mà nó quản lý) sẽ ở lại.
William Pursell

Nếu người dùng bị mất kết nối với máy chủ ssh từ xa vì ví dụ anh ta đột nhiên rút cáp RJ-45, tôi nghĩ rằng máy chủ ssh vẫn giữ phiên này cho đến khi hết thời gian xác định trước (ví dụ 120 giây). Vì vậy, trong trường hợp này, có cách nào để tiếp tục phiên này vẫn còn tồn tại ở phía máy chủ ssh trong vòng 120 giây sau khi rút cáp không?
Gab 是

8

Như William đã nói, câu trả lời ngắn gọn là không, không có cách nào. Để ngăn chặn điều này, bạn có thể sử dụng lệnh màn hình trước khi mất kết nối


từ những gì tôi hiểu, tôi sẽ phải bắt đầu yum với màn hình ... à, tôi đã không làm thế. Tôi không thể chạy lại nó nói nó vẫn đang được sử dụng và tôi không muốn buộc phải giết nó. .. làm thế nào tôi có thể lấy lại quyền kiểm soát của yum đang chạy?

và byobu là một bổ sung tốt cho màn hình, để tự động khởi chạy trong một launchpad

Theo như tôi biết thì bạn không thể, trừ khi có một số cách ẩn để chuyển hướng đầu ra từ lệnh yum sang phiên hạn hiện tại của bạn nhưng tôi không thể nghĩ ra một cách nào đó trên đỉnh đầu.
Nicholas Smith

Có một số giải pháp một phần cho việc này bằng cách sử dụng trình gỡ lỗi & c. để cung cấp cho một quá trình một vỏ cha mẹ mới. Reptyr là một, và một bài đăng trên blog mô tả vấn đề, cách giải quyết và một số triển khai khác.
Eroen

3

Không, bạn không thể khôi phục vỏ sau khi ngắt kết nối. Thay vào đó, những gì bạn có thể làm là đảm bảo lệnh bạn đang chạy tiếp tục chạy sau khi ngắt kết nối.

Để đạt được điều này, hãy sử dụng các lệnh "nohup" và "disown", thường là các lệnh dựng sẵn trên hầu hết các shell, tức là bạn không cần phải cài đặt bất cứ thứ gì. Điều này chỉ hoạt động cho các lệnh không tương tác mặc dù.

Vì vậy, các bước sẽ như sau:

  1. Đăng nhập vào máy chủ
  2. Chạy lệnh của bạn: "nohup sudo yum update &" (điều này cũng sẽ ghi lại tất cả đầu ra vào tệp nohup.out trong thư mục hiện tại của bạn)
  3. Chạy "từ chối% 1"
  4. Vui lòng ngắt kết nối tại thời điểm này hoặc chờ để được ngắt kết nối :)

Khi bạn quay lại máy chủ, chỉ cần "tail nohup.out" để xem lệnh đang hoạt động như thế nào.


Điều này sẽ không hoạt động khá kém trong trường hợp chung ? Ví dụ, với các lệnh muốn nhập vào lúc này hay lúc khác ... Đối với các lệnh hoàn toàn không tương tác, nó có thể hoạt động đủ tốt và tránh được chi phí của (và có thể cần phải cài đặt) bộ ghép kênh đầu cuối.
một CVn

Có, điều này chỉ hoạt động nếu các lệnh của bạn không muốn bất kỳ đầu vào của người dùng, tôi đã cập nhật câu trả lời. Nhìn chung, một bộ ghép kênh đầu cuối là cách chắc chắn, nhưng nó đã được đề cập rằng không có công cụ bổ sung nào được phép cài đặt.
zygis

Hoàn toàn, đó là một câu trả lời hợp lệ, chỉ giới hạn một chút trong các trường hợp sử dụng có thể. Nâng cấp với chỉnh sửa.
một CVn

3

Ai đó đã thêm reptyr trong một bình luận chứ không phải là một câu trả lời vì vậy tôi không thể phản hồi nó, nhưng nó có vẻ là một câu trả lời tốt cho câu hỏi đã chỉnh sửa và hoạt động rất tốt trên CentOS.

xem: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-rucky- Process-new-termminal /

Có cách nào để tôi có thể phục hồi các phiên treo của mình sau khi kết nối lại không?

EDIT: đang thực hiện một số cập nhật và cài đặt với yum và tôi lo lắng đây có thể là vấn đề nếu các quy trình tiếp tục bị treo giữa bất cứ điều gì họ đang làm.

Điều tương tự, tôi đã mất kết nối từ xa vào một phiên cập nhật yum. Vì vậy, tôi đã tìm kiếm và tìm thấy câu hỏi này ... sau đó kết nối lại và sử dụng màn hình lần này:

  1. kết nối lại ssh
  2. màn
  3. cài đặt reptyr theo các liên kết ở trên
  4. ps -a | grep yum
  5. reptyr psid

và tôi đang ở dấu nhắc phục hồi mà yum đã đưa ra vài giờ trước đó.

Về mặt kỹ thuật, các câu trả lời đều đúng, đây KHÔNG phải là sự phục hồi của một phiên treo, nó là sự phục hồi của một quá trình mồ côi cho phiên hiện tại. Và rất hữu ích, nó quá ...


1

Như nhiều người đã đề xuất screentmux, cả hai đều hỗ trợ chức năng cơ bản, nhưng có các tính năng cụ thể riêng biệt, vì vậy người ta không thể nói rằng cái này vượt trội hơn cái khác trong mọi trường hợp. Ví dụ: chỉ tmux hỗ trợ chia tách Cửa sổ , trong khi chỉ có màn hình GNU có thể chuyển đổi gói dài dòng bằng (Ctrl + ar). Xem so sánh chi tiết hơn tại đây .

Ngoài ra còn có các công cụ đặc biệt để khắc phục vấn đề này của ssh:

Autossh là một chương trình để bắt đầu một bản sao của ssh và theo dõi nó, khởi động lại nó khi cần thiết nếu nó chết hoặc dừng lưu lượng. Ý tưởng là từ rstunnel.

Mosh là một ứng dụng thiết bị đầu cuối từ xa cho phép chuyển vùng, hỗ trợ kết nối không liên tục và cung cấp tiếng vang thông minh cục bộ và chỉnh sửa dòng phím của người dùng. Mosh là một sự thay thế cho SSH. Nó mạnh mẽ và phản ứng nhanh hơn, đặc biệt là qua các liên kết Wi-Fi, di động và đường dài.


-1

Điều này có thể được thực hiện bằng cách sử dụng tmuxvỏ. Nếu bạn bị ngắt kết nối, cách nhanh nhất để gắn lại phiên là:

tmux a #0

Điều này không thêm gì mà câu trả lời được chấp nhận không nói. Nó cũng giả định rằng người dùng đã có một tmuxphiên chạy.
Kusalananda

2
Đây có thể là một nhận xét về câu trả lời rằng "bạn có thể viết tắt attacha".
Jeff Schaller
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.