Bối cảnh, zombie, daemon và không có ctty - những khái niệm này có được kết nối không?


8

Làm thế nào những khái niệm quá trình có liên quan với nhau - background, zombie, daemonwithout controlling terminal?

Tôi cảm thấy rằng họ gần gũi, đặc biệt thông qua khái niệm này controlling terminal, nhưng vẫn không có nhiều thông tin để tôi kể một câu chuyện, như nếu bạn cần giải thích điều gì đó với một đứa trẻ đang đọc một bài báo về Linux mà không nói dối quá nhiều.

CẬP NHẬT # 1: Ví dụ (Tôi không biết điều đó có đúng không)

  • background- zombie- quá trình tiền cảnh không thể trở thành zombie, bởi vì zombiequá trình nền bị bỏ lại mà không có cha mẹ
  • daemon- without ctty- tất cả daemonschạy mà không có ctty, nhưng không phải tất cả các quy trình không cttydaemons
  • background- daemon- a background processcó thể được truy xuất để chạy lại tương tác,daemon is not
  • zombie- without ctty- zombiekhông quan tâm nếu có cttygắn liền với nó hay không
  • background- without ctty- processesđược gửi đến nền trong khi họ có ctty, và trở thành daemon hoặc chết nếu cttyđược lấy từ họ

Một quá trình tiền cảnh chắc chắn có thể là một thây ma, mặc dù thường không phải trong bất kỳ khoảng thời gian đáng kể nào - cách thông thường để một vỏ (hoặc chương trình khác) chạy một quy trình con ở phía trước là fork()tắt một bản sao của chính bạn, sử dụng exec()trong bản sao đó để thay thế nó bằng những gì bạn muốn chạy và sử dụng wait()trong trường hợp ban đầu của chương trình (không phải bản sao đã chạy exec()). Trong khoảng thời gian rất, rất ngắn giữa khi đứa trẻ thoát ra và khi wait()gặt hái trạng thái thoát đó (xóa nó khỏi bảng quy trình và trả lại cho người gọi), bạn có một zombie.
Charles Duffy

@CharlesDuffy có thể gửi cha mẹ đến nền trong khi để con chạy ở phía trước không?
anatoly techtonik

Trong kiểm soát công việc điển hình , vỏ thậm chí không biết rằng đứa cháu tách biệt với đứa con trực tiếp của nó; Nó chỉ chờ con của nó thoát ra, và nếu đứa trẻ đang đợi một đứa cháu thoát ra, thì đó là việc của con. Điều đó có nghĩa là - từ quan điểm của cái vỏ sinh ra bố mẹ, nó chỉ giao dịch với một đơn vị.
Charles Duffy

Câu trả lời:


10

Tóm lại, cộng với liên kết.

thây ma

một quá trình đã thoát / chấm dứt, nhưng cha mẹ của chúng chưa thừa nhận chấm dứt (sử dụng các wait()cuộc gọi hệ thống). Các quy trình chết được giữ trong bảng quy trình để cha mẹ của họ có thể được thông báo rằng con của họ về quá trình con thoát ra và trạng thái thoát của chúng. Thông thường, một chương trình cho trẻ em cũng sẽ đọc trạng thái thoát của chúng khi chúng thoát, vì vậy bạn sẽ chỉ nhìn thấy zombie nếu cha mẹ bị dừng hoặc lỗi.

Xem:

kiểm soát thiết bị đầu cuối, phiên, tiền cảnh, nền

Những thứ này liên quan đến kiểm soát công việc trong bối cảnh shell chạy trên thiết bị đầu cuối. Một người dùng đăng nhập, một phiên được bắt đầu, gắn với một thiết bị đầu cuối (thiết bị đầu cuối kiểm soát) và một vỏ được bắt đầu. Shell sau đó chạy các tiến trình và gửi chúng trên nền trước và nền sau như người dùng mong muốn (sử dụng &khi bắt đầu quá trình, dừng nó với ^Z, sử dụng fgbg). Các quy trình trong nền bị dừng nếu đọc hoặc ghi từ thiết bị đầu cuối; các quá trình trong nền trước nhận tín hiệu ngắt nếu ^Cđược nhấn trên thiết bị đầu cuối. (Đó là trình điều khiển đầu cuối của kernel xử lý các tín hiệu đó, shell điều khiển quá trình (nhóm) nào được gửi tới nền trước hoặc nền.

Xem:

daemon

Một tiến trình đang chạy như một daemon thường là một thứ không nên gắn với bất kỳ thiết bị đầu cuối cụ thể nào (hoặc một phiên đăng nhập hoặc vỏ). Nó không nên có một thiết bị đầu cuối điều khiển, vì vậy nó sẽ không nhận được tín hiệu nếu thiết bị đầu cuối đóng và người ta thường không muốn nó làm I / O trên thiết bị đầu cuối. Bắt đầu một daemon từ dòng lệnh yêu cầu phá vỡ tất cả các mối quan hệ với thiết bị đầu cuối, tức là bắt đầu một phiên mới (theo nghĩa kiểm soát công việc, ở trên) để thoát khỏi thiết bị đầu cuối kiểm soát và đóng tay cầm tệp vào thiết bị đầu cuối. Tất nhiên một cái gì đó bắt đầu từ init, systemd hoặc tương tự bên ngoài một phiên đăng nhập sẽ không có những mối quan hệ này để bắt đầu.

Vì một daemon không có thiết bị đầu cuối kiểm soát, nó không chịu sự kiểm soát công việc và nằm trong "tiền cảnh" hoặc "nền" trong ý nghĩa kiểm soát công việc không áp dụng. Ngoài ra, daemon thường tái bố mẹ để initdọn dẹp chúng khi chúng thoát ra, vì vậy bạn thường không xem chúng là zombie.

Xem:


4

Zombie không thực sự liên quan đến những người khác; nó chỉ đơn giản là một quá trình đã kết thúc, nhưng quá trình cha của nó vẫn chưa đọc trạng thái thoát của nó với waitpid()hoặc tương tự. Bạn không nên nhìn thấy những thứ này trừ khi một quá trình bị lỗi hoặc dừng lại.

Một daemon là một chương trình chạy mà không có thiết bị đầu cuối kiểm soát. Thông thường, khi bạn chạy chương trình, fork()schính nó và cha mẹ thoát ra để shell nghĩ rằng lệnh đã kết thúc và tiến trình con tách khỏi thiết bị đầu cuối và thoát khỏi phiên đăng nhập. Vì tiến trình mẹ của nó đã thoát, ID tiến trình cha của nó trở thành 1, theo truyền thống là initchương trình, hoặc những ngày này , systemd. Quá trình này đảm bảo gặt hái những đứa con của nó khi chúng chết để bạn không bị thây ma tấn công.

Một quá trình có thể được liên kết với một thiết bị đầu cuối kiểm soát , đó là nơi nó thường lấy đầu vào từ đó và gửi đầu ra của nó đến. Thiết bị đầu cuối cũng có thể gửi tín hiệu đến các quy trình được đính kèm và xác định một nhóm quy trình là nhóm tiền cảnh . Các quy trình trong nhóm tiền cảnh được phép đọc đầu vào từ thiết bị đầu cuối và được gửi tín hiệu SIGINT và SIGSUSP khi bạn nhấn Ctrl-C và Ctrl-Z. Bất kỳ quá trình nào không nằm trong nhóm tiền cảnh cố đọc từ thiết bị đầu cuối đều bị treo với SIGTSTP.

Shell tạo các nhóm quy trình khác nhau cho mỗi lệnh đường ống mà bạn yêu cầu nó chạy và thay đổi nhóm nào là nhóm tiền cảnh để di chuyển các công việc giữa nền trước và nền. Khi bạn chạy một lệnh, thông thường shell sẽ tạo một nhóm quy trình mới và biến nhóm đó thành nhóm tiền cảnh . Nếu bạn hậu tố nó với một &cái vỏ thì chỉ cần rời khỏi nhóm tiền cảnh nơi nó đã ở và vì vậy nhóm mới ở trong nền. Nhấn Ctrl-Z sẽ gửi SIGSUSP đến nhóm tiền cảnh, điều này khiến hầu hết các lệnh bị tạm dừng, nhưng thay vì tạm dừng, trình bao thay đổi nhóm tiền cảnh hoạt động trở lại chính nó để nó có thể nhắc bạn một lệnh mới.

Các bglệnh gửi SIGCONT cho một nhóm quá trình để nó có thể tiếp tục chạy ở chế độ nền sau khi đã bị đình chỉ với SIGSUSP. fgthay đổi nhóm tiền cảnh thành một trong các nhóm hiện có đang chạy trong nền, đưa nó lên nền trước.


4

Ok, đây là lời giải thích của tôi với sự nhấn mạnh về sự khác biệt giữa các loại quy trình này (ngắn nhưng có nhiều thông tin):

  • zombie- quá trình vừa thoát (kết thúc thực hiện) nhưng vẫn có một mục trong bảng quy trình. Lưu ý : quá trình zombie vẫn có cha mẹ và thông thường, toàn bộ quan điểm tồn tại của nó là để cho quá trình cha mẹ đó biết về kết quả thực hiện của con (mã thoát, v.v.).
  • disowned process(không có thiết bị đầu cuối kiểm soát) - quá trình được người dùng xác định rõ ràng disownhoặc được thiết kế để tách ra khỏi cây quy trình cha. Nó vẫn sẽ chạy ngay cả khi tiến trình cha sẽ kết thúc thực thi. Ví dụ: người dùng sshđã chuyển sang một máy từ xa, bắt đầu một cái gì đó như máy chủ web, sau đó chạy disowntrên nó và thoát khỏi sshphiên. Quá trình vẫn sẽ được chạy vì nó không phải là một phần của cây quy trình cha mẹ nữa. Quá trình cũng có thể bị từ chối chạy nó với nohup.
  • background process- chạy trong nền - không phân chia đầu ra cho tty của người dùng. Hoặc là được chạy với &cuối cùng, hoặc tự rẽ vào một nền theo thiết kế. Tùy chọn khác để gửi một quá trình đến một nền là bắt đầu nó và nhấn ctrl+z. Tuy nhiên, khi quá trình cha mẹ sẽ chấm dứt, đứa trẻ chạy trong nền cũng sẽ chấm dứt ( lưu ý bởi @psusi - thực tế trước đó chỉ đúng với các quy trình được bắt đầu từ một thiết bị đầu cuối bởi người dùng, nếu không, quá trình con trở thành 'mồ côi' và nhận được quá trình init (pid 1) là cha mẹ).
    • daemon- rất giống với quá trình nền. Cũng chạy trong một nền nhưng hầu hết có lẽ đã được rẽ nhánh (theo thiết kế). Thông thường, nó nằm lặng lẽ trong một nền chờ đợi một số thậm chí xảy ra và chỉ sau đó mới thực hiện một công việc thực tế (kết nối đến, v.v.). Trên thực tế, daemon có thể bị từ chối (có thể hơn) và quá trình nền tùy thuộc vào thiết kế của nó.

Hy vọng giải thích này sẽ giúp phân biệt các loại quy trình.


Đẹp. Bảng quy trình thuộc về cha mẹ? Vì vậy, zombie chết mà không có chủ của họ?
anatoly techtonik

Bảng không phải là một từ đúng. Đó là một quá trình tree. Vâng, chắc chắn, cha mẹ không bị ràng buộc chấm dứt sau khi con của nó chấm dứt (nhưng nó có thể làm như vậy nếu nó đang chờ một đứa trẻ hoàn thành việc xử lý một số loại công cụ). Nhưng nếu cha mẹ chấm dứt - con chắc chắn sẽ chấm dứt. Bạn có thể chạy toptừ thiết bị đầu cuối của mình và sau đó nhấn shift-vđể xem các cây xử lý trong tự nhiên.
ddnomad

1
Một cha mẹ chấm dứt không giết chết con cái của nó. Những đứa trẻ mồ côi có ID quy trình cha mẹ được đổi thành init (1).
psusi

@psusi bạn nói đúng, tôi quên rằng chỉ có quá trình bắt đầu trong thiết bị đầu cuối. Tôi sẽ sửa câu trả lời của tôi.
ddnomad

Tôi sẽ chỉ loại bỏ câu "nó sẽ biến mất khỏi bàn sớm". Nó gợi ý rằng bằng cách nào đó nó sẽ tự động biến mất sau một thời gian, nhưng đó không phải là trường hợp; "biến mất" là một sự kiện rất cụ thể.
AnoE
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.