Tại sao các công việc nền được bắt đầu bởi shell của tôi sống lâu hơn shell cha và các thiết bị đầu cuối kiểm soát?


6

Người ta thường nói rằng "&" đưa quy trình vào thực thi nền, nhưng quy trình đó sẽ bị hủy khi đóng thiết bị đầu cuối. Nhưng từ những gì tôi thấy, mọi thứ tôi gửi vào nền đang tiếp tục hoạt động lâu sau khi tôi đóng thiết bị đầu cuối. Ví dụ:

$ tail -f /var/log/messages/ &

Quá trình đó sẽ tiếp tục chạy, ngay cả khi không có quá trình nào khác theo người dùng đã khởi chạy nó và tất cả các thiết bị đầu cuối đã qua lâu. Tại sao vậy?



1
Câu hỏi sẽ ít trùng lặp hơn nếu tiêu đề được thay đổi để phù hợp với nội dung của nó, gần với câu hỏi "Tại sao các công việc nền được bắt đầu bởi shell của tôi sống lâu hơn shell cha và các thiết bị đầu cuối kiểm soát?"
jw013

Câu trả lời:


7

Chỉ là một phỏng đoán (điều này là bashcụ thể): tài liệu cho huponexittùy chọn shell nói

Nếu được đặt, Bash sẽ gửi SIGHUP tới tất cả các công việc khi thoát khỏi vỏ đăng nhập tương tác

Trên hệ thống của tôi, nó dường như không được đặt theo mặc định. Bạn có thể kiểm tra với

shopt -p huponexit

Nếu đầu ra bao gồm -u, nó không được đặt.


Thật vậy, nó bao gồm -u.
Rogach

5

Một quá trình được đặt trong nền với '&' thay vì nohup sẽ chết khi nó yêu cầu thiết bị đầu cuối cho đầu vào hoặc đầu ra và phát hiện ra nó không có ở đó. Trong trường hợp này, tailcó thể sẽ thoát khi có gì đó ghi vào / var / log / message, mặc dù có thể có một số vấn đề về bộ đệm sẽ trì hoãn nó cho đến khi có nhiều hơn một tin nhắn được viết.

Bắt đầu một quá trình với ./foo > /dev/null 2&1 < /dev/nulltương đương với bắt đầu với nohup. Về cơ bản, tất cả các nohup đều quan tâm đến việc chuyển hướng bất kỳ đầu vào và đầu ra nào chưa được chuyển hướng khỏi thiết bị đầu cuối.


3

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 SIGHUPvà 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 disownsẽ báo cho shell không gửi nó SIGHUPkhi đó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 SIGHUPgửi đến nó bởi bất kỳ shell nào. setsidkhô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 setsidthay vì nohup.

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.