Halloween στο Linux: Πώς να σκοτώσετε τις διαδικασίες ζόμπι

σφραγίδα αποκριών

Η ημέρα των νεκρών έρχεται και γι 'αυτό θέλουμε να κάνουμε αυτό το μικρό σεμινάριο από την LxA για να μιλήσουμε για το διεργασίες ζόμπι και πώς μπορούμε να τους σκοτώσουμε. Το πρώτο πράγμα που πρέπει να πούμε είναι ποια είναι η διαδικασία ζόμπι και ότι όπως γνωρίζετε, ο πυρήνας του Linux έχει ένα υποσύστημα για τη διαχείριση των διεργασιών και συνεργάζεται με τον προγραμματιστή για τη δημιουργία, την τροποποίηση της προτεραιότητας, την αποστολή ή την κατάργηση της ροής επεξεργασίας της CPU και σκοτώσει τις διαδικασίες. Λοιπόν, αυτό το μέρος του πυρήνα, όπως και τα υπόλοιπα συστήματα που μοιάζουν με Unix, διακρίνει τις διάφορες καταστάσεις διεργασιών ...

Έτσι μπορούμε να το βρούμε αυτό μια διαδικασία Μπορεί να είναι σε κατάσταση ύπνου (S), δηλαδή να κοιμάται. Επίσης διεργασίες σε κατάσταση λειτουργίας (R) που είναι αυτές που εκτελούνται ή εκτελούνται αυτήν τη στιγμή, διαδικασίες αναμονής (D) που σταματούν να περιμένουν να παραστούν, gestpt (T) ή σε αναστολή, καθώς και τα ζόμπι (Z) ή νεκρός. Μια διαδικασία ζόμπι ή νεκρή είναι αυτή που έχει ήδη τερματιστεί με επιτυχία, αλλά έχει παραβιαστεί ορισμένοι πόροι συστήματος, καθώς το Linux το αποθηκεύει ακόμα στον πίνακα διεργασιών. Γνωρίζετε ήδη ότι όταν τελειώνει μια διαδικασία, δεν θα πρέπει να παραμείνει σε αυτήν την κατάσταση, αλλά μάλλον ολοκληρώνεται και ο πυρήνας απελευθερώνει τους πόρους έτσι ώστε άλλες διαδικασίες να μπορούν να τους χρησιμοποιήσουν, ουσιαστικά ελευθερώνει την κατεχόμενη μνήμη RAM ...

Λοιπόν, επειδή δεν είναι ενδιαφέρον να έχουμε τέτοιου είδους διαδικασίες ζόμπι, αν και δεν είναι τόσο συχνές, μπορούμε να τις αναζητήσουμε και να τις εξαλείψουμε όπως αναφέρεται εδώ. Το πρώτο πράγμα είναι να βρούμε αν υπάρχουν διαδικασίες ζόμπι στη διανομή μας και για αυτό μπορούμε να βοηθήσουμε τον εαυτό μας εργαλεία όπως το top ή like ps. Για παράδειγμα, μία από αυτές τις δύο επιλογές:

ps -el | grep 'Z'

ps aux | grep defunct

Και μόλις εντοπιστεί, μπορούμε Σκότωσέ τον απευθείας με:

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

Αν και μια άλλη εναλλακτική λύση είναι να βρείτε τις γονικές διαδικασίες, από τότε σκοτώστε μια διαδικασία ζόμπι Πρέπει να σκοτώσεις τις γονικές διαδικασίες που τη διατηρούν, όπως μπορεί να έχεις συμπεράνει:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Θα πρέπει να αντικαταστήσετε από το αναγνωριστικό της διαδικασίας ζόμπι που έχετε βρει και για να το σκοτώσετε με kill, χρησιμοποιήστε το ID της γονικής διαδικασίας αντικαθιστώντας στο παράδειγμα, προφανώς.


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: AB Internet Networks 2008 SL
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   έκανε μπάλες dijo

    Καλός ιστότοπος!
    Πάντα μας βγάζουν από τα προβλήματα.

    Πού λέει:
    Αν και μια άλλη εναλλακτική είναι να βρείτε τις γονικές διεργασίες, αφού για να σκοτώσετε μια διαδικασία ζόμπι πρέπει να σκοτώσετε τις γονικές διεργασίες που την υποστηρίζουν, όπως ίσως έχετε συμπεράνει:

    1 | ps -eo pid, ppid | grep
    2|
    3 | σκοτώστε -9

    Θα πρέπει να αντικαταστήσετε το αναγνωριστικό της διαδικασίας ζόμπι που βρήκατε και για να το σκοτώσετε με kill, χρησιμοποιήστε προφανώς το αναγνωριστικό της γονικής διαδικασίας που αντικαθιστά στο παράδειγμα.

    μπορείτε να προσθέσετε το σενάριο:

    $ γάτα killppid.sh
    #! / bin / bash
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{εκτύπωση $ 2}')

    Φυσικά, δεν είναι μια εργασία που εκτελεί συνεχώς ένας κανονικός χρήστης.
    Θα ήταν χρήσιμο μόνο για τον διαχειριστή, αλλά είναι επικίνδυνο να το εκτελείτε ως root, γιατί μπορεί να σκοτώσει οποιαδήποτε διεργασία στο σύστημα.

    Στο man kill έχει αυτή τη σημείωση:

    ΣΗΜΕΙΩΣΕΙΣ Το κέλυφός σας (διερμηνέας γραμμής εντολών) μπορεί να έχει μια ενσωματωμένη εντολή kill. Μπορείς
    πρέπει να εκτελέσετε την εντολή που περιγράφεται εδώ ως / bin / kill για να λύσετε τη σύγκρουση.

    Ο Bash έχει αυτή την εντολή, αυτό είναι το μέρος του man bash σχετικά με αυτό:

    σκοτώνει [-s sigspec | -n signum | -sigspec] [pid | προδιαγραφή εργασίας] ...
    kill -l | -L [sigspec | exit_status]
    Στείλτε το σήμα με το όνομα sigspec ή signum στις διεργασίες που ονομάζονται ανά pid ή εργασία
    spec. Το sigspec είναι είτε ένα όνομα σήματος χωρίς διάκριση πεζών-κεφαλαίων, όπως το SIGKILL (με ή
    χωρίς το πρόθεμα SIG) ή έναν αριθμό σήματος. signum είναι ένας αριθμός σήματος. Αν
    Το sigspec δεν υπάρχει, τότε το SIGTERM θεωρείται. Ένα όρισμα του -l παραθέτει το
    ονόματα σημάτων. Εάν παρέχονται ορίσματα όταν δίνεται -l, τα ονόματα των
    παρατίθενται σήματα που αντιστοιχούν στα ορίσματα και η κατάσταση επιστροφής είναι 0.
    Το όρισμα exit_status στο -l είναι ένας αριθμός που καθορίζει είτε έναν αριθμό σήματος είτε
    την κατάσταση εξόδου μιας διεργασίας που τερματίζεται από ένα σήμα. Η επιλογή -L είναι ισοδύναμη
    δάνεισε σε -l. Το kill επιστρέφει true εάν τουλάχιστον ένα σήμα στάλθηκε με επιτυχία ή
    false εάν παρουσιαστεί σφάλμα ή παρουσιαστεί μη έγκυρη επιλογή.

    Στην αρχή εξηγούν πώς το bash προστατεύει τις διεργασίες, για να αποφύγει κάποια προβλήματα, αλλά δεν μου είναι ξεκάθαρο πώς θα μπορούσα να φτιάξω ένα ασφαλές σενάριο για να τρέχει ως root.
    Το μόνο που μπορώ να σκεφτώ είναι να το προστατεύσω ως εξής:

    $ γάτα killppid.sh
    #! / bin / bash
    αν [$ USER == "root"]
    τότε echo Μην εκτελείτε $0 ως root !!! είναι επικίνδυνο!
    έξοδος
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{εκτύπωση $ 2}')

    $

    Χρησιμοποιήστε το bash's kill, όχι / bin / kill

    Πώς μπορείτε να δείτε ότι δεν είμαι πολύ γνώστης του bash.
    Ξέρετε πώς να γράψετε ένα ασφαλές σενάριο που εκτελείται ως χρήστης της θυγατρικής διαδικασίας, ακόμα κι αν εκτελείται ως root;
    κάτι αντίστοιχο με αυτό που θα γινόταν χειροκίνητα ως εξής:

    $ su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{εκτύπωση $ 2}')