20Aug
Εάν είστε χρήστης Linux, ίσως έχετε δει ζόμπι διεργασίες γύρω από τη λίστα επεξεργαστών σας.Δεν μπορείτε να σκοτώσετε μια διαδικασία ζόμπι γιατί είναι ήδη νεκρό - σαν ένα πραγματικό ζόμπι.
Τα ζόμπι είναι βασικά τα απομεινάρια των νεκρών διαδικασιών που δεν έχουν καθαριστεί σωστά.Ένα πρόγραμμα που δημιουργεί διαδικασίες ζόμπι δεν προγραμματίζεται σωστά - τα προγράμματα δεν υποτίθεται ότι αφήνουν τις διαδικασίες ζόμπι να κολλήσουν.
Πιστωτική εικόνα: Daniel Hollister στο Flickr( Remixed)
Τι είναι μια διαδικασία ζόμπι;
Για να καταλάβετε τι είναι μια διαδικασία ζόμπι και τι προκαλεί τις διαδικασίες ζόμπι να εμφανιστούν, θα πρέπει να καταλάβετε λίγο πώς επεξεργάζονται τις διαδικασίες στο Linux.
Όταν μια διαδικασία πεθαίνει στο Linux, δεν απομακρύνεται όλα από τη μνήμη αμέσως - ο περιγραφέας της διαδικασίας παραμένει στη μνήμη( ο περιγραφέας διαδικασίας παίρνει μόνο μια μικρή ποσότητα μνήμης).Η κατάσταση της διαδικασίας γίνεται EXIT_ZOMBIE και ο γονέας της διαδικασίας ειδοποιείται ότι η παιδική της διαδικασία έχει πεθάνει με το σήμα SIGCHLD.Στη συνέχεια, η γονική διαδικασία υποτίθεται ότι εκτελεί την κλήση συστήματος wait() wait για να διαβάσει την κατάσταση εξόδου της νεκρικής διαδικασίας και άλλες πληροφορίες.Αυτό επιτρέπει στη γονική διαδικασία να πάρει πληροφορίες από τη νεκρή διαδικασία.Μετά την κλήση wait() , η διαδικασία ζόμπι αφαιρείται εντελώς από τη μνήμη.
Αυτό συμβαίνει συνήθως πολύ γρήγορα, έτσι δεν θα δείτε διαδικασίες ζόμπι που συσσωρεύονται στο σύστημά σας.Ωστόσο, αν μια γονική διαδικασία δεν έχει προγραμματιστεί σωστά και ποτέ δεν καλεί wait() , τα παιδιά της ζόμπι θα κολλήσουν στη μνήμη μέχρι να καθαριστούν.
Βοηθητικά προγράμματα όπως το GNOME System Monitor, η άνω εντολή και η εντολή ps εμφανίζουν τις διαδικασίες ζόμπι.
Κίνδυνοι από διαδικασίες ζόμπι
Οι διαδικασίες Zombie δεν χρησιμοποιούν κανέναν πόρο του συστήματος.(Στην πραγματικότητα, ο καθένας χρησιμοποιεί μια πολύ μικρή ποσότητα μνήμης συστήματος για να αποθηκεύσει τον περιγραφέα της διαδικασίας του.) Ωστόσο, κάθε διαδικασία ζόμπι διατηρεί το αναγνωριστικό διαδικασίας( PID).Τα συστήματα Linux έχουν ορισμένο αριθμό αναγνωριστικών διεργασίας - 32767 από προεπιλογή σε συστήματα 32 bit.Εάν τα ζόμπι συσσωρεύονται με πολύ γρήγορο ρυθμό - για παράδειγμα, αν το σωστά προγραμματισμένο λογισμικό διακομιστή δημιουργεί διαδικασίες ζόμπι υπό φορτίο - ολόκληρη η ομάδα διαθέσιμων PIDs θα ανατεθεί τελικά σε διαδικασίες ζόμπι, εμποδίζοντας την εκκίνηση άλλων διαδικασιών.
Ωστόσο, μερικές διαδικασίες ζόμπι που κρέμονται γύρω δεν αποτελούν πρόβλημα - παρόλο που δείχνουν ένα σφάλμα με τη γονική τους διαδικασία στο σύστημά σας.
Να απαλλαγείτε από τις διεργασίες ζόμπι
Δεν μπορείτε να σκοτώσετε τις διαδικασίες ζόμπι καθώς μπορείτε να σκοτώσετε τις κανονικές διαδικασίες με το σήμα SIGKILL - οι διαδικασίες ζόμπι είναι ήδη νεκρές.Έχετε υπόψη ότι δεν χρειάζεται να απαλλαγείτε από τις διαδικασίες ζόμπι εκτός αν έχετε ένα μεγάλο ποσό στο σύστημά σας - μερικά ζόμπι είναι αβλαβή.Ωστόσο, υπάρχουν μερικοί τρόποι για να απαλλαγείτε από τις διαδικασίες ζόμπι.
Ένας τρόπος είναι η αποστολή του σήματος SIGCHLD στη γονική διαδικασία.Αυτό το σήμα λέει στη γονική διαδικασία να εκτελέσει την κλήση συστήματος wait() wait και να καθαρίσει τα παιδιά του zombie.Στείλτε το σήμα με την εντολή kill , αντικαθιστώντας το pid στην παρακάτω εντολή με το PID της γονικής διεργασίας:
kill -s SIGCHLD pid
Ωστόσο, εάν η μητρική διαδικασία δεν έχει προγραμματιστεί σωστά και αγνοεί τα σήματα SIGCHLD,Δεν βοηθάτε.Θα πρέπει να σκοτώσετε ή να κλείσετε τη γονική διαδικασία των ζόμπι.Όταν η διαδικασία που δημιούργησε τα ζόμπι τελειώνει, η init κληρονομεί τις διαδικασίες ζόμπι και γίνεται ο νέος γονέας τους.(το init είναι η πρώτη διαδικασία που ξεκίνησε στο Linux κατά την εκκίνηση και του αποδίδεται PID 1.) Το init εκτελεί περιοδικά την κλήση συστήματος wait() για να καθαρίσει τα παιδιά του zombie, έτσι init θα κάνει σύντομη εργασία των ζόμπι.Μπορείτε να ξεκινήσετε εκ νέου τη γονική διαδικασία μετά το κλείσιμο της.
Εάν μια γονική διαδικασία συνεχίζει να δημιουργεί ζόμπι, θα πρέπει να οριστεί έτσι ώστε να καλεί σωστά το wait() για να καρπωθούν τα παιδιά του ζόμπι.Καταγράψτε μια αναφορά σφάλματος αν ένα πρόγραμμα στο σύστημά σας συνεχίζει να δημιουργεί ζόμπι.