phiên tmux bị giết khi ngắt kết nối với ssh


23

Tóm tắt : Tôi đang cố gắng tìm hiểu tại sao phiên tmux của tôi chết khi tôi ngắt kết nối với ssh

Chi tiết :

Tôi đã cài đặt tmux trên hệ thống Arch Linux. Khi tôi bắt đầu một phiên tmux, tôi có thể tách ra khỏi nó và sau đó đính kèm lại trong khi phiên ssh đang hoạt động. Nhưng nếu tôi kết thúc phiên ssh của mình thì phiên tmux sẽ bị giết.

Tôi biết đây không phải là hành vi bình thường vì tôi có hệ thống khác trong đó phiên tmux tiếp tục chạy ngay cả khi phiên ssh kết thúc và tôi có thể đính kèm vào phiên tmux sau khi thiết lập kết nối ssh mới. Hệ thống có sự cố và hệ thống hoạt động chính xác có cấu hình rất giống nhau nên tôi không biết phải kiểm tra gì.

Tôi đang chạy phiên bản tmux 1.9a. Hệ thống có sự cố (mà tôi có quyền truy cập root) có phiên bản nhân Linux là 3.17.4-1 và hệ thống hoạt động đúng có phiên bản kernel 3.16.4-1-ARCH (Tôi không có quyền root hệ thống). Tôi nghi ngờ rằng phiên bản kernel là nguồn gốc của vấn đề, đó chỉ là một điểm khác biệt mà tôi nhận thấy.

Tôi nghĩ tôi sẽ hỏi xem có ai đã nhìn thấy một vấn đề tương tự và biết về một giải pháp khả thi chưa.

Các bước chính xác dẫn đến vấn đề là:

  1. ssh vào máy
  2. chạy tmuxđể bắt đầu tmux
  3. ctrl-B D để tách ra (tại thời điểm này tôi có thể gắn lại với tmux attach
  4. đóng phiên ssh (tại thời điểm này phiên tmux bị hủy, tôi đã có thể quan sát điều này khi tôi đăng nhập với quyền root trong một thiết bị đầu cuối khác)
  5. kết nối lại với ssh và chạy tmux attachvà tôi nhận được thông báo no sessionsvà chạy tmux lstrả về failed to connect to server: Connection refused. Điều này có ý nghĩa bởi vì phục vụ không chạy. Điều không có ý nghĩa với tôi là tại sao nó bị giết ở bước 4 khi tôi ngắt kết nối với phiên ssh.

dữ liệu bước:

Đáp lại một trong những ý kiến ​​tôi đã sử dụng strace để xem những gì hệ thống gọi là quá trình máy chủ tmux tạo ra. Có vẻ như khi tôi thoát phiên ssh của mình (bằng cách gõ exithoặc bằng ctrl-d) thì quá trình tmux đang bị giết. Đây là một đoạn của phần cuối cùng của đầu ra strace.

poll([{fd=4, events=POLLIN}, {fd=11, events=POLLIN}, {fd=6, events=POLLIN}], 3, 424) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
sendto(3, "\17", 1, 0, NULL, 0)         = 1
+++ killed by SIGKILL +++

Tôi đã so sánh điều này với một hệ thống khác trong đó tmux hoạt động chính xác và trên hệ thống đó, quá trình tmux vẫn tiếp tục chạy ngay cả khi tôi thoát. Vì vậy, nguyên nhân gốc rễ xuất hiện là quá trình tmux đang bị chấm dứt khi tôi đóng phiên ssh. Tôi sẽ cần dành thời gian để khắc phục sự cố này để tìm hiểu lý do tại sao, nhưng tôi nghĩ rằng tôi sẽ cập nhật câu hỏi của mình vì đề xuất strace là hữu ích.


để chắc chắn, vui lòng mô tả từng bước: Tôi giả sử bạn ssh, bắt đầu một phiên tmux, tách khỏi phiên và đóng shh: khi bạn ssh một lần nữa, bạn không có cách nào để tham gia lại phiên tmix? tức là phiên không còn chạy?
Olivier Dulac

@OlivierDulac vâng, giả định của bạn là đúng. Tôi cũng đã chỉnh sửa câu hỏi của mình để bao gồm những chi tiết này.
Gabriel Nam

Làm thế nào để bạn đóng phiên ssh? và bạn có thể gắn một bước vào pid của tmux và một cái khác vào pid của sshd, để xem nó có nhận được gì không khi bạn đóng kết nối ssh (rất dài dòng, chuyển hướng đến một tệp)
Olivier Dulac

@OlivierDulac cảm ơn bạn đã gợi ý. Tôi đã cập nhật câu hỏi với thông tin từ strace. Có vẻ như quá trình máy chủ tmux đang bị giết khi tôi kết thúc phiên ssh. Tôi không nghĩ rằng điều này đáng lẽ phải xảy ra, vì vậy tôi cần tìm hiểu tại sao nó lại xảy ra.
Gabriel Nam

Bắt đầu tmux với tính năng ghi nhật ký chi tiết được bật và xem có gì được in vào nhật ký khi bạn ngắt kết nối không. Ngoài ra, TERM trên máy từ xa vào và ra khỏi tmux là gì?
jasonwryan

Câu trả lời:


16

Học thuyết

Một số hệ thống init bao gồm systemd cung cấp một tính năng để giết tất cả các quy trình thuộc dịch vụ. Dịch vụ thường bắt đầu một quy trình duy nhất tạo ra nhiều quy trình hơn bằng cách giả mạo và các quy trình đó cũng có thể làm điều đó. Tất cả các quy trình như vậy thường được coi là một phần của dịch vụ. Trong systemd, điều này được thực hiện bằng cách sử dụng các nhóm .

Trong systemd, tất cả các quy trình thuộc một dịch vụ sẽ bị hủy khi dịch vụ bị dừng theo mặc định. Máy chủ SSH rõ ràng là một phần của dịch vụ. Khi bạn kết nối với máy chủ, máy chủ SSH thường chuyển đổi và quy trình mới xử lý phiên SSH của bạn. Bằng cách chuyển từ quy trình phiên SSH hoặc con của nó, các quy trình phía máy chủ khác được bắt đầu, bao gồm cả màn hình hoặc tmux của bạn .

Killmode và kích hoạt ổ cắm

Hành vi mặc định có thể được thay đổi bằng cách sử dụng lệnh KillMode. Dự án ngược dòng không AFAIK bao gồm bất kỳ .servicetệp nào và do đó, các tệp này thay đổi theo phân phối. Thông thường có hai cách để kích hoạt SSH trên hệ thống của bạn. Một là cổ điển ssh.serviceduy trì một trình nền SSH chạy dài trên mạng. Khác là thông qua kích hoạt ổ cắm được xử lý bởi ssh.socketlần lượt bắt đầu sshd@.servicechỉ chạy cho một phiên SSH duy nhất.

Các giải pháp

Nếu các quy trình của bạn bị giết vào cuối phiên, có thể bạn đang sử dụng kích hoạt ổ cắm và nó bị giết bởi systemd khi thông báo rằng quá trình phiên SSH đã thoát. Trong trường hợp đó có hai giải pháp. Một là tránh sử dụng kích hoạt ổ cắm bằng cách sử dụng ssh.servicethay vì ssh.socket. Khác là để thiết lập KillMode=processtrong Servicephần ssh@.service.

Các KillMode=processthiết lập cũng có thể hữu ích với cổ điển ssh.service, vì nó tránh giết chết quá trình phiên SSH hoặc màn hình hoặc tmux quá trình khi máy chủ được ngừng hoặc khởi động lại.

Ghi chú tương lai

Câu trả lời này rõ ràng đã đạt được một mức độ phổ biến. Mặc dù nó hoạt động cho OP nhưng có thể nó không hoạt động cho ai đó trong tương lai do sự phát triển hoặc cấu hình logind của hệ thống . Vui lòng kiểm tra tài liệu về các phiên logind nếu bạn gặp hành vi khác với mô tả trong câu trả lời này.


Bất kỳ thông tin phản hồi cụ thể từ downvoter hoặc chỉ trolling?
Pavel imerda

3
Cảm ơn đã phản ứng chi tiết. Chuyển sang sshd.service đã khắc phục sự cố.
Gabriel Nam

Tôi gặp vấn đề này trên một hệ thống sử dụng initchứ không phải systemd. Nhưng dù sao nó cũng hơi khác, xem câu hỏi của tôi .
gerrit

5

Bạn có sử dụng systemd với kích hoạt socket cho SSH không?

Nếu vậy, có một vấn đề được biết đến với điều đó . Theo những người đề xuất systemd, đây thực sự là một tính năng - systemd giết chết tất cả các quy trình được sinh ra bởi một phiên khi phiên kết thúc. (Tôi có thể thấy rằng nó hữu ích, nhưng trong GNU screen, hoặc tmux, trong trường hợp, bạn chắc chắn không muốn điều đó ☺ cũng như trong hầu hết các trường hợp khác mà người dùng có thể chạy các quy trình nền, tất nhiên.)

Nếu vậy, hãy thử chuyển từ sshd.sockettớisshd.service .


1
Tôi thường nói rằng bạn thường không muốn sử dụng tính năng đó cho đăng nhập SSH nếu người dùng của bạn được phép chạy các quy trình đang chạy sau khi đăng xuất. Điều đó không dành riêng cho màn hình hoặc tmux mà là SSH (với bất kỳ quy trình nền nào ở phía máy chủ).
Pavel imerda

2
@ PavelŠimerda có, tôi nghĩ rằng nó ẩn, nhưng đã chỉnh sửa bài đăng để làm cho nó rõ ràng hơn bây giờ.
mirabilos

3

Tôi gặp vấn đề tương tự với tmux và màn hình trên Ubuntu 16.04 (kde neon). Khi phiên ssh bị ngắt kết nối, màn hình / tmux bị chấm dứt.

Câu chuyện dài, systemd đã thay đổi cài đặt mặc định của họ thành killuser process = yes, vì vậy sau khi rời phiên ssh, mọi tiến trình được tạo bởi nó sẽ bị chấm dứt.

Dễ dàng sửa chữa (sau nhiều giờ cố gắng) chạy màn hình / tmux bằng lệnh này

Cho màn hình

systemd-run --scope --user screen

cho Tmux

systemd-run --scope --user tmux

Bạn có thể tạo một bí danh để làm cho nó dễ dàng hơn

alias tmux= "systemd-run --scope --user tmux"


-bash: systemd-run: command not foundtrên Red Hat Enterprise Linux Server release 6.8 (Santiago).
gerrit

Nó có hoạt động khi tôi chưa root?
gerrit

1
Tôi nhận thấy hành vi giết chết màn hình / tmux không mong muốn không xảy ra trên Ubuntu 18.04 LTS, chỉ 16.04.
Seth

2

Một giải pháp khác cho vấn đề này, không yêu cầu chuyển từ sshd.socketsang sshd.service, là khởi động tmuxmáy chủ dưới dạng dịch vụ systemd [0]. Bằng cách này, tmuxmáy chủ đã chạy khi bạn SSH vào máy chủ, thay vì sinh ra bởi tmuxlệnh trong SSH, do đó sẽ không bị giết.

[0] https://wiki.archlinux.org/index.php/tmux#Autostart_with_systemd


Nó có hoạt động khi tôi chưa root?
gerrit

Vâng, đó là một giải pháp hợp lệ. Nhưng bạn vẫn muốn giải quyết vụ việc bằng cách khởi động lại dịch vụ SSH qua phiên SSH. :)
Pavel imerda

Các bạn, trong trường hợp bạn sử dụng OpenRC, tôi đã tạo một bản inmm tmux giống như tệp dịch vụ được đề cập trong ArchWiki
Megver83

1

Câu trả lời tốt nhất mà tôi đã tìm thấy, IMO, được đưa ra tại Ngăn chặn đăng xuất từ ​​giết chết phiên tmux :

"Tính năng" này đã tồn tại systemdtrước đây, nhưng các systemdnhà phát triển đã quyết định thực hiện thay đổi trong mặc định , để cho phép cài đặt chấm dứt các tiến trình con khi đăng xuất khỏi phiên.

Bạn có thể hoàn nguyên cài đặt này trong logind.conf( /etc/systemd/logind.conf):

KillUserProcesses=no
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.