Dấu và &
sẽ đưa quá trình vào nền. Mô tả tệp (stdout, stderr, stdin) không bị ảnh hưởng. Khi thoát khỏi shell, shell sẽ gửi SIGHUP
đến mọi thứ mà nó sinh ra, vì vậy khi shell này đóng lại, quá trình nền sẽ nhận được SIGHUP
và có thể chấm dứt. Trong một số shell (bash, zsh), bạn có thể ngăn chặn điều này bằng cách sử dụng lệnh disown
sẽ báo cho shell không gửi nó SIGHUP
khi đóng shell và quá trình sẽ tiếp tục chạy.
Bạn cũng có thể thực hiện tương đương với 'nền bằng cách sử dụng dấu và' bằng cách gửi SIGSTOP
(thường là Ctrl-Z trong thiết bị đầu cuối của bạn) và sau đó làm nền cho quá trình ( bg
).
nohup hoạt động bằng cách bỏ qua SIGHUP. Bố trí tín hiệu này sau đó được chuyển đến tiến trình con bạn chạy. nohup cũng kiểm tra xem thiết bị xuất chuẩn sẽ đi đâu và nếu nó đi đến thiết bị đầu cuối, nó sẽ chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn vào một tệp. Sau khi thay đổi bố trí tín hiệu và chuyển hướng có thể, nó sẽ chạy quy trình của bạn trong nền.
Vì vậy, sự khác biệt là gì?
Một quá trình nền không bỏ qua SIGHUP
, mặc dù bạn có thể yêu cầu shell của mình không gửi nó đi. Trừ khi được ngăn chặn,nohup
chuyển hướng stdout sang các tệp nohup.out mà tôi có xu hướng ghét, nếu chỉ cần tôi xóa các tệp nohup.out nằm rải rác ngẫu nhiên trên đĩa của tôi.
Ngoài ra còn có setsid
, làm cho quá trình của bạn trở thành một nhóm trưởng quy trình. Một người lãnh đạo nhóm quá trình sẽ không bao giờ được SIGHUP
gửi đến nó bởi bất kỳ shell nào. setsid
không nhiều với thiết bị xuất chuẩn / thiết bị xuất chuẩn và tôi có xu hướng sử dụng setsid
thay vì nohup
.