Tại sao PGID của con tôi xử lý không phải là PID của cha mẹ?


13

Vì vậy, tôi tiếp tục đọc ở khắp mọi nơi rằng lệnh này sẽ chấm dứt tất cả các quy trình con của quy trình cha:

kill -- -$$

Sử dụng ID âm với lệnh kill tham chiếu PGID và từ các ví dụ tôi đã thấy, nó xuất hiện PGID của các tiến trình con sẽ là PID của cha mẹ nhưng không phải là trường hợp trên hệ thống của tôi.

Trên hệ thống của tôi, PGID của đứa trẻ giống như PGID của tập lệnh gốc, hóa ra là bash.

Những gì đang xảy ra ở đây? Các ví dụ đã sai hay hệ thống của tôi được thiết lập khác nhau?

Những gì tôi cần đạt được là chấm dứt các tiến trình con mà không chấm dứt cha mẹ vì vậy tôi không muốn gửi tín hiệu tiêu diệt tới PGID mà cha mẹ đang ở.

Câu trả lời:


11

Tôi nghĩ bạn có nghĩa là PGID, viết tắt của ID nhóm quy trình .

Khi một quá trình được rẽ nhánh, nó thừa hưởng PGID từ cha mẹ của nó. PGID thay đổi khi một quá trình trở thành trưởng nhóm quy trình , sau đó PGID của nó được sao chép từ PID của nó. Từ đó trở đi, đứa trẻ mới xử lý nó sinh ra và con cháu của chúng, thừa hưởng PGID đó (trừ khi chúng bắt đầu các nhóm quy trình mới của riêng chúng).

Trong một shell có kiểm soát công việc, chẳng hạn như hầu hết các shell tương tác, mỗi công việc được đặt trong nhóm quy trình riêng của nó. Nếu bạn chạy tập lệnh shell, quy trình shell chạy tập lệnh sẽ là nhóm trưởng và PGID sẽ bằng với PID của nó.

Trong một trình bao không có kiểm soát công việc, như hầu hết các trình bao được sử dụng để chạy các tập lệnh, các lệnh được chạy trong nhóm quy trình của trình bao.

Cú pháp kill -- -Ngiết chết tất cả các quy trình trong nhóm bằng PGID = N. Bạn không thể sử dụng nó với một PID tùy ý, chỉ có PID của một nhà lãnh đạo nhóm quy trình, vì đó là PGID. Đây thực chất là cách vỏ

kill %jobid

cú pháp hoạt động - nó nội bộ chuyển %jobidsang PGID của công việc và gửi tín hiệu đến PGID đó.

Không có cách đơn giản nào để chạy tập lệnh trong nhóm quy trình của chính nó từ tập lệnh shell khác. Tuy nhiên, hãy xem Cách đặt nhóm quy trình của tập lệnh shell cho một số đề xuất.


Bạn đang nói rằng một vỏ có hoặc không có kiểm soát công việc làm điều tương tự?
TCZ8

1
Không. Một vỏ với kiểm soát công việc bắt đầu một nhóm quy trình mới cho mỗi công việc. Một shell không có kiểm soát công việc sẽ không bắt đầu một nhóm quy trình mới cho mỗi công việc, nó chạy chúng trong nhóm quy trình riêng của nó.
Barmar

wow .. Tôi đã không đọc nó ngay lần đầu tiên. Vì vậy, tôi đoán những gì tôi muốn là bật kiểm soát công việc? Điều đó có đảm bảo rằng những đứa trẻ có PGID phù hợp với PID của tập lệnh gốc không? Hay mỗi đứa trẻ sẽ có được PGID độc đáo của riêng mình?
TCZ8

Tôi tìm thấy một số tài liệu trực tuyến về kiểm soát công việc, tôi sẽ trải qua điều đó. Cảm ơn sự giúp đỡ của bạn Barmar.
TCZ8

1
Với kiểm soát công việc, mỗi đứa trẻ sẽ có PGID riêng. Không có kiểm soát công việc, họ thừa hưởng PGID của cha mẹ. Nhưng cha mẹ có thể đã thừa hưởng PGID của từ cha mẹ của nó , nếu đó không phải là người lãnh đạo nhóm quy trình.
Barmar
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.