Halloween trên Linux: cách tiêu diệt các quy trình zombie

tem halloween

Ngày của người chết sắp đến và đó là lý do tại sao chúng tôi muốn thực hiện hướng dẫn nhỏ này từ LxA để nói về quy trình zombie và làm thế nào chúng ta có thể giết chúng. Điều đầu tiên cần nói là quy trình zombie là gì, và như bạn đã biết, hạt nhân Linux có một hệ thống con để quản lý các quy trình và làm việc với bộ lập lịch để tạo, thay đổi mức độ ưu tiên, gửi hoặc xóa luồng xử lý CPU và tiêu diệt các quá trình. Chà, phần này của hạt nhân, giống như phần còn lại của các hệ thống giống Unix, phân biệt giữa các trạng thái khác nhau của các tiến trình ...

Vì vậy, chúng tôi có thể thấy rằng một tiến trình nó có thể ở trạng thái ngủ (S), tức là ngủ. Ngoài ra các tiến trình đang ở trạng thái đang chạy (R) là các tiến trình hiện đang chạy hoặc đang chạy, các tiến trình đang chờ (D) đang dừng chờ được tham gia, cử chỉ (T) hoặc bị treo, và cả các thây ma (Z) hoặc đã chết. Quá trình xác sống hoặc quá trình chết là một quá trình đã được kết thúc thành công, nhưng có một số tài nguyên hệ thống nhất định bị chiếm đoạt vì Linux vẫn đang lưu nó trong bảng quá trình. Bạn đã biết rằng khi một tiến trình kết thúc, nó sẽ không ở trạng thái này mà sẽ hoàn thành và hạt nhân giải phóng tài nguyên để các tiến trình khác có thể sử dụng chúng, về cơ bản nó sẽ giải phóng bộ nhớ RAM bị chiếm dụng ...

Chà, vì không có gì thú vị khi có loại quy trình zombie này, mặc dù chúng không thường xuyên, chúng ta có thể tìm kiếm và loại bỏ chúng như được chỉ ra ở đây. Điều đầu tiên là tìm xem có các quy trình zombie trong bản phân phối của chúng tôi hay không và vì điều đó, chúng tôi có thể tự giúp mình các công cụ như top hoặc like ps. Ví dụ: một trong hai tùy chọn sau:

ps -el | grep 'Z'

ps aux | grep defunct

Và sau khi được phát hiện, chúng tôi có thể giết nó trực tiếp với:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

Mặc dù một giải pháp thay thế khác là tìm các quy trình mẹ, vì tiêu diệt một quá trình thây ma Bạn phải giết các quy trình mẹ duy trì nó, như bạn có thể đã suy luận:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Bạn sẽ phải thay thế bằng ID của tiến trình zombie mà bạn đã tìm thấy và để tiêu diệt nó bằng cách tiêu diệt, hãy sử dụng ID của tiến trình mẹ thay thế trong ví dụ, rõ ràng.


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: AB Internet Networks 2008 SL
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

      làm bóng dijo

    Trang web tốt!
    Họ luôn giúp chúng tôi thoát khỏi khó khăn.

    Nơi nói:
    Mặc dù một giải pháp thay thế khác là tìm các quy trình mẹ, vì để tiêu diệt một quy trình zombie, bạn phải giết các quy trình mẹ hỗ trợ nó, như bạn có thể đã suy luận:

    1 | ps -eo pid, ppid | grep
    2|
    3 | giết -9

    Bạn sẽ phải thay thế cho ID của tiến trình zombie mà bạn đã tìm thấy và để tiêu diệt nó bằng cách giết, rõ ràng là sử dụng ID của tiến trình mẹ thay thế trong ví dụ.

    bạn có thể thêm tập lệnh:

    $ con mèo killppid.sh
    #! / bin / bash
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Tất nhiên, nó không phải là nhiệm vụ mà một người dùng bình thường thực hiện mọi lúc.
    Nó sẽ chỉ hữu ích cho quản trị viên, nhưng sẽ rất nguy hiểm nếu chạy nó dưới dạng root, vì nó có thể giết chết bất kỳ quá trình nào trên hệ thống.

    Trong con người giết nó có ghi chú này:

    LƯU Ý Trình bao (trình thông dịch dòng lệnh) của bạn có thể có lệnh kill tích hợp sẵn. Bạn có thể
    cần chạy lệnh được mô tả ở đây là / bin / kill để giải quyết xung đột.

    Bash có lệnh đó, đây là phần của con người về nó:

    giết [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
    giết -l | -L [sigspec | exit_status]
    Gửi tín hiệu được đặt tên bởi sigspec hoặc signum tới các quy trình được đặt tên bởi pid hoặc job
    thông số kỹ thuật. sigspec là tên tín hiệu không phân biệt chữ hoa chữ thường, chẳng hạn như SIGKILL (với hoặc
    không có tiền tố SIG) hoặc số tín hiệu; dấu hiệu là một số tín hiệu. Nếu như
    sigspec không có, thì SIGTERM được giả định. Đối số -l liệt kê
    tên tín hiệu. Nếu bất kỳ đối số nào được cung cấp khi -l được cung cấp, tên của
    các tín hiệu tương ứng với các đối số được liệt kê và trạng thái trả về là 0.
    Đối số exit_status thành -l là một số chỉ định số tín hiệu hoặc
    trạng thái thoát của một quá trình được kết thúc bởi một tín hiệu. Tùy chọn L là tương đương
    cho vay -l. kill trả về true nếu ít nhất một tín hiệu được gửi thành công, hoặc
    false nếu xảy ra lỗi hoặc gặp phải tùy chọn không hợp lệ.

    Ở phần đầu, họ giải thích cách bash bảo vệ các quy trình, để tránh một số vấn đề, nhưng tôi không rõ làm cách nào để tạo một tập lệnh an toàn để chạy dưới dạng root.
    Điều duy nhất tôi có thể nghĩ là bảo vệ nó như thế này:

    $ con mèo killppid.sh
    #! / bin / bash
    nếu [$ USER == "root"]
    sau đó echo Không chạy $ 0 dưới dạng root !!! nó nguy hiểm!
    ra
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    Sử dụng bash's kill, không phải / bin / kill

    Làm thế nào bạn có thể thấy tôi không thành thạo lắm về bash.
    Bạn có biết cách viết một tập lệnh bảo mật chạy với tư cách người dùng của tiến trình con, ngay cả khi nó chạy dưới quyền root không?
    một cái gì đó tương đương với những gì sẽ được thực hiện thủ công như thế này:

    $ su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')