Tôi đã đọc một câu trả lời từ một người dùng đã tuyên bố rằng đang chạy
foo 2>&1 >& output.log &
sẽ dẫn đến việc foo
tiếp tục chạy ngay cả khi họ đăng xuất. Theo người dùng này, điều này thậm chí còn hoạt động trên các kết nối SSH.
Tôi thực sự không tin rằng, vì tôi có ấn tượng rằng trong trường hợp ngắt kết nối với SSH, hoặc chấm dứt TTY, trình bao và do đó các quy trình của nó sẽ nhận được SIGHUP, khiến chúng chấm dứt. Điều này, theo giả định của tôi, là lý do duy nhất để sử dụng nohup
trong những trường hợp như vậy, hoặc tmux
, screen
et al.
Sau đó tôi nhìn vào hướng dẫn của glibc :
Tín hiệu này cũng được sử dụng để báo cáo chấm dứt quá trình kiểm soát trên thiết bị đầu cuối với các công việc liên quan đến phiên đó; chấm dứt này có hiệu quả ngắt kết nối tất cả các quy trình trong phiên từ thiết bị đầu cuối kiểm soát.
Điều này dường như để xác nhận suy nghĩ của tôi. Nhưng nhìn xa hơn, nó nói :
Nếu quy trình là một nhà lãnh đạo phiên có thiết bị đầu cuối kiểm soát, thì tín hiệu SIGHUP được gửi đến từng quy trình trong công việc nền trước và thiết bị đầu cuối kiểm soát bị tách khỏi phiên đó.
Vì vậy, điều này có nghĩa là các công việc được đặt trong nền sẽ không nhận được SIGHUP?
Để tôi thêm bối rối, tôi đã chạy một phiên Zsh tương tác, chạy yes >& /dev/null &
và gõ exit
, khi Zsh cảnh báo tôi rằng tôi đã chạy việc và sau khi gõ exit
lần thứ hai, nói với tôi rằng nó đã SIGHUPed một công việc. Làm chính xác như vậy trong Bash để lại công việc đang chạy
logout
vàyes
vẫn đang chạy.