Xóa một quá trình zombie khỏi bảng quy trình


8

Tôi đã có một quá trình zombie khó chịu được thông qua bởi init và nó sẽ không biến mất. Tôi đã đọc có một cách để tạo ra một quy trình giả, gắn zombie như một đứa trẻ của quy trình mới đósau đó giết nó, loại bỏ nó khỏi bảng quy trình.

Làm thế nào tôi có thể làm điều đó, chính xác?

Và vâng, tôi đã đọc hầu hết những thứ này:

Một quá trình zombie đã chết, vì vậy nó không thể bị giết.

Hoặc là

Bạn chỉ nên khởi động lại hệ thống của bạn

Quá trình zombie không sử dụng bất kỳ tài nguyên nào, bạn chỉ nên để chúng là

Thật không may, rất nhiều chương trình kiểm tra bảng quy trình để xem liệu một cá thể có đang chạy hay không và sẽ từ chối bắt đầu một chương trình mới nếu có một mục trong bảng quy trình.

Và khởi động lại mỗi khi kết nối SSHFS của tôi bị mất, sử dụng Sublime với nó, thật là ngớ ngẩn.


7
... Với một khẩu súng ngắn. ;)
Nathan C

+1, vì tôi đã nhìn vào chính và thấy "giết zombie"
HoplessN00b

Câu trả lời:


16

Cách duy nhất để thoát khỏi zombie là làm cho cha mẹ của nó wait()để nó có thể báo cáo trạng thái thoát của nó. Bạn có thể làm điều đó bằng cách gửi SIGCHLDcho cha mẹ, giả sử cha mẹ được viết đúng.

Nếu bạn có zombie, điều đó thường có nghĩa là cha mẹ KHÔNG được viết đúng (vì đứa trẻ đã được gửi SIGCHLDcho cha mẹ của nó khi nó chết và trở thành một thây ma), vì vậy bước tiếp theo là giết cha mẹ.
Một công cụ như pstree(với -ptùy chọn) có thể cho bạn thấy dòng dõi zombie của bạn để bạn biết quá trình nào là cha mẹ.
Khi cha mẹ chết, thây ma sẽ được nhận nuôi init, điều này luôn wait()khiến trẻ em chết, và sẽ vui vẻ giết tất cả những thây ma mà nó nhận nuôi.

Nếu quy trình cha mẹ thực sự là init(PID 1) thì bạn đã ở trong một tình huống không bao giờ xảy ra. Bạn có thể thử gửi SIGCHLDđến init, nhưng bạn thực sự không cần phải làm điều đó và nếu điều đó không hiệu quả thì cách duy nhất của bạn là khởi động lại vì hệ thống của bạn initbị hỏng và không hoạt động.

(Đây là các tùy chọn "shotgun".)


Một số người sáng tạo hơn tôi cũng đã đưa ra tùy chọn này nếu bạn muốn tránh giết quá trình cha mẹ:

  1. Xác định PIDS của zombie & quy trình cha mẹ
    (Đối với ví dụ này, giả sử zombie là PID 3101 và cha mẹ là PID 3100)
  2. Cháy lên gdbattachđến với cha mẹ:
    attach 3100
  3. Gọi waitpidcho zombie:
    call waitpid(3101,0,0)
  4. Tách khỏi cha mẹ ( detach) và thoát khỏi trình gỡ lỗi.

(Đây là một khẩu súng bắn tỉa được tinh chỉnh.)


1
heh, câu trả lời tuyệt vời Súng trường "Mosin" ngay tại đó.
Danila Ladner

1
@DanilaLadner Tôi ước mình có thể nhận được tín dụng, nhưng cho đến khi tôi tìm kiếm trên google một chút để xem skerit có ý nghĩa gì về việc "gắn zombie như một đứa trẻ của một quá trình giả", ý nghĩ về việc sử dụng trình gỡ lỗi để buộc waitpid()tôi không bao giờ xảy ra. Tôi là một lập trình viên khủng khiếp ...
voretaq7

call waitpidkhông bao giờ trả lại cho tôi
deFreitas

0

Tại sao bạn lo lắng về quá trình zombie? Các tài nguyên họ giữ liên kết là tối thiểu (không gian cho một nhiệm vụ cấu trúc khung xương, một PID và không nhiều thứ khác). Chắc chắn, nó là vô hình, nhưng đó là nó. Tìm kiếm cha mẹ của họ và sửa chúng, thay thế chúng bằng các lựa chọn thay thế bằng văn bản tốt hơn (có thể có các tác dụng phụ có lợi khác), báo cáo rằng đó là lỗi (mà chắc chắn là như vậy).

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.