Tại sao SSH không chờ đợi các quy trình nền?


13

Tại sao nó ssh -tkhông chờ công việc nền hoàn thành?

Thí dụ:

ssh user@example 'sleep 2 &'

Điều này hoạt động như mong đợi, vì ssh trở lại sau 2 giây, trong khi

ssh user@example -t 'sleep 2 &'

không chờ đợi sleepđể kết thúc và trở về ngay lập tức.

Bất cứ ai có thể giải thích lý do đằng sau này? Có cách nào để ssh -tchờ tất cả các quá trình nền kết thúc trước khi quay lại không?

Trường hợp sử dụng của tôi là tôi bắt đầu một tập lệnh ssh -tvà tập lệnh này bắt đầu một số công việc nền sẽ tồn tại sau khi tập lệnh chính kết thúc. Với ssh -tđiều này là không thể cho đến nay.

Câu trả lời:


22

Không có -t, sshdnhận được thiết bị xuất chuẩn của vỏ từ xa (và trẻ em thích sleep) và thiết bị xuất chuẩn thông qua hai ống (và cũng gửi đầu vào của khách hàng qua một ống khác).

sshd không chờ đợi quá trình nó đã khởi động shell đăng nhập của người dùng, nhưng đồng thời, sau khi quá trình đó kết thúc, hãy chờ đợi eof trên ống stdout (không phải là ống stderr trong trường hợp opensh ít nhất).

Và eof xảy ra khi không có bộ mô tả tệp bởi bất kỳ quy trình nào mở ở đầu viết của ống, điều này thường chỉ xảy ra khi tất cả các quy trình không được chuyển hướng xuất sắc của chúng sang một thứ khác.

Khi bạn sử dụng -t, sshdkhông sử dụng đường ống. Thay vào đó, tất cả các tương tác (stdin, stdout, stderr) với shell từ xa và các phần tử con của nó được thực hiện bằng cách sử dụng một cặp đầu cuối giả.

Với cặp đầu cuối giả, để sshdtương tác với phía chủ, không có cách xử lý eof tương tự hoặc bất kỳ cách nào để biết liệu vẫn còn các quy trình với fds mở cho phía nô lệ của thiết bị đầu cuối giả hay không, vì vậy nó chỉ chờ kết thúc quá trình nó thực thi shell đăng nhập của người dùng từ xa và sau đó thoát.

Khi thoát ra, phía chủ của cặp pty bị đóng, điều đó có nghĩa là pty bị phá hủy, do đó các quá trình được kiểm soát bởi nô lệ sẽ nhận được SIGHUP (theo mặc định sẽ chấm dứt chúng).


1
cảm ơn câu trả lời thấu đáo! một điều nữa tôi muốn biết: liệu tất cả các quá trình nền có chấm dứt khi thiết bị đầu cuối giả không? kịch bản tôi đang bắt đầu bắt đầu một dịch vụ, hoạt động tốt với ssh. nhưng khi sử dụng ssh -t, dịch vụ không được khởi động. có vẻ như dịch vụ sẽ ngừng hoạt động khi ssh trở lại.
Philipp Murry

Trên thực tế, có một cách để phía chủ của thiết bị đầu cuối giả biết khi nào tất cả các mô tả tệp nô lệ đã bị đóng. Đó là cùng một cơ chế được kích hoạt bởi một thiết bị đầu cuối thực sự khi tất cả các mô tả tệp cho nó đã bị đóng, trên thực tế.
JdeBP


@JdeBP, bạn có muốn mở rộng không? Tôi không chắc ý của bạn là gì. Trình giả lập thiết bị đầu cuối AFAICT (ít nhất là xterm và gnome-terminal) không quan tâm đến các quy trình vẫn mở fds cho nô lệ khi quy trình họ thực hiện shell trong die
Stéphane Chazelas 21/2/2017

@PhilippMurry Bạn có thể sử dụng nohupđể giữ cho tập lệnh chạy như vậy. (Bạn cũng có thể xem xét bắt đầu các công việc dài hạn bên trong tmuxđể bạn có thể theo dõi tiến trình của họ một cách tương tác, nhưng một tệp nhật ký hoạt động tốt.)
jpaugh

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.