Làm cách nào để kết nối lại với màn hình bị mất (tách rời, mất ổ cắm)?


23

Tôi đã có một screenphiên chạy trên một máy chủ gia đình. Máy trạm của tôi cần khởi động lại, vì vậy tôi tách ra và giết thiết bị đầu cuối. Khi kết nối lại với máy chủ, tôi thực hiện điển hình của mình

$ screen -D -R
[new screen]

Huh? Không, không phải là một phiên mới, đưa tôi cái cũ. Tôi biết, tôi sẽ lấy nó trực tiếp. Tên ổ cắm là gì?

$ screen -list
No Sockets found in /var/run/screen/S-username

$ ls -a /var/run/screen/S-username
.  ..

Đợi ... cái gì? Tôi biết tôi đã để nó chạy. Nó đi đâu

$ ps -ef | grep -i screen
username  30860     1  0 Oct16 ?        00:00:29 SCREEN

Vâng, có quá trình. Nhưng không có ổ cắm để vượt qua screen -r. Làm thế nào tôi có thể gắn lại vào phiên của tôi?

Câu trả lời:


28

Screenkiểm tra fifo / socket bất cứ khi nào nó nhận được SIGCHLDtín hiệu. Nếu ổ cắm bị thiếu, nó sẽ được tạo lại. Vì vậy, giải pháp là tìm quá trình và gửi nó SIGCHLD.

Trên hệ thống Debian của tôi, screendường như được cài đặt là setgid utmpnhưng không phải setuid, vì vậy giải pháp đầu tiên từ FAQ dưới đây đã hoạt động:

$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost

Trên các hệ thống có cài đặt màn hình setuid root, điều này sẽ không hoạt động và bạn sẽ cần phải giết một trong các tiến trình con của phiên màn hình hoạt động để buộc kernel gửi tín hiệu cho bạn. Điều này có nghĩa là hy sinh một trong các cửa sổ màn hình của bạn để kết nối lại với phần còn lại (chọn một cách khôn ngoan!).

Từ một Câu hỏi thường gặp về Gentoo Wiki :

Thiếu ổ cắm

Đôi khi ổ cắm của màn hình vẫn đang chạy có thể bị phá hủy, mặc dù quy trình thực tế và tất cả các quy trình con của nó vẫn đang chạy. danh sách màn hình sẽ hiển thị "Không tìm thấy ổ cắm trong / tmp / usc Greens / .." Một số hướng dẫn hữu ích về cách phục hồi từ điều này (và một vài vấn đề không phổ biến khác) tại http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC khoảng 2/3 đường xuống.

H: Vì một số lý do không xác định, fifo in / tmp / Screens / S-myname đã biến mất và tôi không thể tiếp tục phiên màn hình của mình. Có cách nào để tạo lại fifo?

A: Màn hình kiểm tra fifo / socket bất cứ khi nào nó nhận được tín hiệu SIGCHLD. Nếu thiếu, fifo / socket được tạo lại sau đó.

Nếu màn hình đang chạy không được thiết lập, người dùng có thể phát hành kill -CHLD screenpidtrực tiếp (nó nằm -CHILDtrên một số hệ thống). Screenpid là id tiến trình của quá trình màn hình được tìm thấy trong ps -xdanh sách.

Nhưng thường thì điều này sẽ không hoạt động, vì màn hình nên được cài đặt root setuid. Trong trường hợp này, bạn sẽ không thể gửi tín hiệu, nhưng kernel sẽ. Nó làm như vậy, bất cứ khi nào một đứa trẻ của màn hình thay đổi trạng thái của nó. Tìm id tiến trình (shellpid bên dưới) của shell "ít quan trọng nhất" đang chạy bên trong màn hình. Sự cố gắng kill -STOP shellpid. Nếu fifo / socket không xuất hiện lại, phá hủy tiến trình shell. Bạn hy sinh một cái vỏ để cứu những người còn lại. Nếu không có gì hoạt động, xin đừng quên xóa tất cả các quy trình đang chạy trong phiên màn hình bị mất.

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.