Làm thế nào để giết cả quá trình và quy trình con?


9

Tôi đã hỏi một câu hỏi để biết cách nhận nhiều dòng tin nhắn từ mô đun quy trình con của Python.

Vấn đề là trong quá trình thử nghiệm, tôi đã phải giết quá trình trăn chạy quy trình gnuchess. Sử dụng ^ c trong dòng lệnh dường như để giết quá trình python, nhưng không phải là gnuprocess.

Để giết gnuchess, tôi lấy pid với ps aux | grep gnuchess và chạy kill -9 PID . Có phương pháp nào khác để giết cả quá trình trăn và gnuchess không?


8
Sidenote ngẫu nhiên: Bạn có thể sử dụng pkillđể giết một quá trình theo tên, vì vậy ps aux | grep gnuchessvà bạn kill -9 PIDcó thể trở thànhpkill -9 gnuchess
Michael Mrozek

Câu trả lời:


10

Có một phương pháp tiêu chuẩn, nếu các chương trình hợp tác. Chạy kill -- -42trong đó 42 là pid của quá trình cha. Điều này sẽ gửi tín hiệu đến tất cả các quy trình trong nhóm quy trình dẫn theo quy trình 42 (dấu trừ trước pid có nghĩa là nhóm quy trình).

Thông thường, nếu bạn chạy tập lệnh python của bạn từ dấu nhắc shell và nó chỉ đơn giản là rẽ nhánh gnuchess, hai quy trình sẽ vẫn nằm trong cùng một nhóm quy trình. Nhưng điều này dường như không phải là trường hợp, vì Ctrl+ Cgửi SIGINTđến toàn bộ nhóm quy trình tiền cảnh.

Gnuchess có thể nằm trong nhóm quy trình riêng của mình vì nó tự biến mình thành một người lãnh đạo phiên (nhưng tôi không biết tại sao nó lại làm điều này), hoặc bởi vì bạn đã nhân đôi nó (con trăn tạo ra một cái vỏ mà không phải là nữ thần). Một ngã ba đôi có thể tránh được, nhưng tôi không thể cho bạn biết làm thế nào mà không nhìn thấy mã của bạn.


Một cách hợp lý đáng tin cậy và phù hợp với POSIX để tìm ra mấu chốt của gnuchessquy trình là

gnuchess_pids=$(ps -A -o pid= -o cmd= | awk '$2 ~ /(^|\/)gnuchess$/ {print $1}')

Các biến thể unix cụ thể có thể có những cách tốt hơn để đạt được điều này, chẳng hạn như pgrep.


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.