Τι είναι μια διαδικασία ζόμπι στο Linux;
Αν είστε χρήστης του Linux, ίσως έχετε δει ζόμπι διεργασίες γύρω από τη λίστα επεξεργαστών σας. Δεν μπορείτε να σκοτώσετε μια διαδικασία ζόμπι γιατί είναι ήδη νεκρό - σαν ένα πραγματικό ζόμπι.
Τα ζόμπι είναι βασικά τα απομεινάρια των νεκρών διαδικασιών που δεν έχουν καθαριστεί σωστά. Ένα πρόγραμμα που δημιουργεί διαδικασίες ζόμπι δεν προγραμματίζεται σωστά - τα προγράμματα δεν υποτίθεται ότι αφήνουν τις διαδικασίες ζόμπι να κολλήσουν.
Image Credit: Ο Daniel Hollister στο Flickr (Remixed)
Τι είναι μια διαδικασία Zombie?
Για να καταλάβετε τι είναι μια διαδικασία ζόμπι και τι προκαλεί τις διαδικασίες ζόμπι να εμφανιστούν, θα πρέπει να καταλάβετε λίγο πώς επεξεργάζονται τις διαδικασίες στο 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. Στείλτε το σήμα με το σκοτώνω εντολή, αντικατάσταση pid στην παρακάτω εντολή με το PID της γονικής διαδικασίας:
kill-s SIGCHLD pid
Ωστόσο, εάν η γονική διαδικασία δεν έχει προγραμματιστεί σωστά και αγνοεί τα σήματα SIGCHLD, αυτό δεν θα βοηθήσει. Θα πρέπει να σκοτώσετε ή να κλείσετε τη γονική διαδικασία των ζόμπι. Όταν η διαδικασία που δημιούργησε τα ζόμπι τελειώνει, η init κληρονομεί τις διαδικασίες ζόμπι και γίνεται ο νέος γονέας τους. (init είναι η πρώτη διαδικασία που ξεκίνησε στο Linux κατά την εκκίνηση και του αποδίδεται το PID 1.) Το init εκτελεί περιοδικά την κλήση συστήματος wait () για να καθαρίσει τα παιδιά του zombie, έτσι init θα κάνει σύντομη εργασία των ζόμπι. Μπορείτε να κάνετε επανεκκίνηση της γονικής διαδικασίας μετά το κλείσιμο της.
Εάν μια γονική διαδικασία συνεχίζει να δημιουργεί ζόμπι, θα πρέπει να οριστεί έτσι ώστε να καλεί σωστά την αναμονή () για να καρπωθούν τα παιδιά της. Καταγράψτε μια αναφορά σφάλματος αν ένα πρόγραμμα στο σύστημά σας συνεχίζει να δημιουργεί ζόμπι.