Tại sao wget của tôi không chết sau khi mất kết nối ssh?


13

Tôi sshed đến máy chủ của tôi và chạy wget -r -np zzz.aaa/bbb/cccvà nó bắt đầu làm việc. Sau đó, kết nối Internet của tôi (ở nhà tôi) bị gián đoạn và tôi đã lo lắng khi cho rằng đó wgethupped vì sshkết nối bị mất và do đó thiết bị đầu cuối đã chết. Nhưng sau đó tôi đã sshgửi tới máy chủ của mình và nhận ra rằng nó vẫn đang chạy và đưa đầu ra vào wget.logvà tải xuống công cụ. Ai đó có thể vui lòng giải thích cho tôi những gì có thể đã xảy ra ở đây?

Đây là những gì psmang lại cho tôi:

PID   %CPU %MEM    VSZ    RSS TTY     STAT START   TIME COMMAND
32283  0.6 29.4 179824 147088 ?       S    14:00   1:53 wget -r -np zzz.aaa/bbb/ccc

Nó có nghĩa gì (dấu hỏi) ?trong cột của tty?


Lưu ý rằng trên một hệ thống hiện đại đang chạy logind, hành vi mặc định logindlà giết (SIGTERM) tất cả các quy trình thuộc về người dùng khi người dùng đăng xuất. Vì vậy, hành vi này là cụ thể hệ thống.
Daniel Pryden

@Dan Hệ thống của tôi là Ubuntu 16.04
yukashima huksay

2
Tôi tin rằng Ubuntu 16.04 là một hệ thống systemd / logind, nhưng bộ logind.conf mặc định của Ubuntu được thiết lập rõ ràng KillUserProcesses=no.
Daniel Pryden

Câu trả lời:


21

Các chương trình (và tập lệnh) có thể chọn bỏ qua hầu hết các tín hiệu, ngoại trừ một số thích KILL. Các HUPtín hiệu có thể bị bắt và bỏ qua nếu phần mềm nên mong muốn.

Đây là từ src/main.ccác wgetnguồn (phiên bản 1.19.2):

/* Hangup signal handler.  When wget receives SIGHUP or SIGUSR1, it
   will proceed operation as usual, trying to write into a log file.
   If that is impossible, the output will be turned off.  */

Một chút nữa xuống bộ xử lý tín hiệu được cài đặt:

  /* Setup the signal handler to redirect output when hangup is
     received.  */
  if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
    signal(SIGHUP, redirect_output_signal);

Vì vậy, có vẻ như wgetkhông được bỏ qua các HUPtín hiệu, nhưng nó lựa chọn để tiếp tục xử lý với sản lượng của nó chuyển hướng đến các tập tin đăng nhập.


Yêu cầu trong ý kiến: Ý nghĩa của ?trong TTYcột đầu ra từ pstrong câu hỏi là wgetquá trình không phải là bất kỳ còn liên kết với một thiết bị đầu cuối / TTY. TTY biến mất khi kết nối SSH bị hỏng.


1
Tôi nghĩ rằng nó sẽ hữu ích nếu bạn cũng thêm ý nghĩa của? trong tty
yukashima huksay

Vâng, học điều này một cách khó khăn. Không phải tất cả các quá trình chết khi ssh giảm. Thật tốt khi biết chính xác tại sao.
Doug

2
Thay phiên, tạo thói quen sử dụng màn hình và không bao giờ HUP.
Harper - Tái lập Monica

8

Đơn giản : wgetkhông hủy bỏ SIGHUP. Nó làm SIGTERMSIGINTmặc dù.

Không có gì trên mantrang nhưng nếu bạn đã gửi SIGHUPđến một wgetquy trình thì bạn sẽ nhận được điều này trong thiết bị đầu cuối:

# in a different terminal while wget is running (with PID 12345)
kill -HUP 12345
# in the wget terminal
SIGHUP received.
Redirecting output to 'wget-log'.

1
Cảm ơn. Tôi nghĩ sẽ tốt hơn nếu bạn cũng thêm kill -HUP pidlệnh để chỉ ra cách người ta có thể gửi SIGHUPđến một quy trình.
yukashima huksay
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.