Trước hết, mỗi khi bạn thực thi một lệnh, shell của bạn sẽ rẽ nhánh một tiến trình mới, bất kể bạn có chạy nó &
hay không. &
chỉ có nghĩa là bạn đang chạy nó trong nền.
Lưu ý điều này không chính xác lắm. Một số lệnh, như cd
là các hàm shell và thường sẽ không tạo ra một tiến trình mới. type cmd
thường sẽ cho bạn biết liệu cmd
một lệnh bên ngoài hay hàm shell. type type
cho bạn biết rằng type
chính nó là một hàm shell.
nohup
là một cái gì đó khác nhau. Nó nói quá trình mới để bỏ qua SIGHUP
. Đó là tín hiệu được gửi bởi kernel khi shell cha được đóng lại.
Để trả lời câu hỏi của bạn, hãy làm như sau:
- chạy
emacs &
(theo mặc định sẽ chạy trong một cửa sổ X riêng) .
- trên vỏ cha, chạy
exit
.
Bạn sẽ nhận thấy rằng emacs
cửa sổ bị giết, mặc dù đang chạy trong nền. Đây là hành vi mặc định vànohup
được sử dụng chính xác để sửa đổi điều đó.
Điều hành một công việc trong nền (với &
hoặc bg
, tôi cá là các shell khác cũng có các cú pháp khác) là một tính năng shell, xuất phát từ khả năng của các hệ thống hiện đại để đa nhiệm. Thay vì forking một trường hợp vỏ mới cho mỗi chương trình bạn muốn khởi động, vỏ hiện đại ( bash
, zsh
, ksh
, ...) sẽ có khả năng quản lý một danh sách các chương trình (hoặc công việc ). Chỉ một trong số chúng tại một thời điểm có thể ở phía trước , có nghĩa là nó được tập trung vào vỏ. Tôi ước ai đó có thể mở rộng hơn về sự khác biệt giữa một quá trình đang chạy ở nền trước và một trong nền (quy trình chính được chấp nhận stdin
/stdout
).
Trong mọi trường hợp, điều này không ảnh hưởng đến cách quá trình con phản ứng SIGHUP
. nohup
làm.
nohup
không. Phần nào bạn đã nhầm lẫn?