Từ man nohup
:
Nếu đầu vào tiêu chuẩn là một thiết bị đầu cuối, hãy chuyển hướng nó từ / dev / null. Nếu đầu ra tiêu chuẩn là một thiết bị đầu cuối, hãy nối đầu ra vào nohup.out
nếu có thể, $HOME/nohup.out
nếu không. Nếu lỗi tiêu chuẩn là một thiết bị đầu cuối, chuyển hướng nó đến đầu ra tiêu chuẩn. Để lưu đầu ra vào TẬP_TIN, hãy sử dụng nohup COMMAND > FILE
.
(được sửa đổi hoàn toàn dựa trên các nhận xét)
Khi thoát khỏi trình bao hoặc đóng thiết bị đầu cuối, các tiến trình con sẽ được gửi SIGHUP (hangup, tên bắt nguồn từ thời điểm các thiết bị đầu cuối quay số vào máy tính UNIX) để nói với chúng rằng thiết bị đầu cuối không có kết nối lâu hơn. Ngoài ra, khi quá trình shell kết thúc, các luồng stdin, stdout và stderr của tiến trình con sẽ bị đóng. Thông thường điều này làm cho quá trình trẻ em chết. Thông thường đây là một điều tốt vì nó tránh để các tiến trình chạy không có người dùng.
Mục đích của nohup
chương trình là giữ cho quá trình chạy ngay cả sau khi shell kết thúc và ngắt kết nối đầu cuối. Như vậy, chỉ đạo đầu ra của nó đến thiết bị đầu cuối hoàn toàn đánh bại mục đích. Câu trả lời ban đầu của tôi ( nohup COMMAND | cat
) không hữu ích vì: khi thiết bị đầu cuối bị đóng, đầu ra của mèo bị đóng và do đó mèo chết làm vỡ đường ống và gửi SIGPIPE đến quy trình nohup khiến nó chết. Tôi đã trả lời câu hỏi mà không nghĩ đến mục đích.
Để đạt được mục đích của bạn, hãy chạy nohup COMMAND > FILE
để chọn tên của tệp để xuất trực tiếp. Sau đó sử dụng tail -f FILE
để xem đầu ra trên một thiết bị đầu cuối.
Tương tự, người ta có thể sử dụng cấu trúc shell sau: COMMAND >FILE 2>&1 </dev/null &
để chạy một lệnh có luồng stdio không được kết nối với thiết bị đầu cuối và có thể tiếp tục chạy sau khi thiết bị đầu cuối bị đóng. Ngoài ra, trong zsh, hãy chạy shell-dựng disown
để báo cho zsh rời khỏi tiến trình thay vì giết nó khi shell kết thúc.