Αυτό το script πρέπει να εκτελείται ως cron job στον λογαριασμό φιλοξενίας σας (cPanel).
Δεν αποτελεί τέλεια λύση (καθώς δεν υπάρχει τέτοια) – είναι περισσότερο μια προσωρινή λύση (workaround), καθώς δεν αντιμετωπίζει το πραγματικό πρόβλημα. Αυτό που κάνει το script είναι να διαχειρίζεται τα “κολλημένα” (hanging) processes, στέλνοντάς τους ένα σήμα SIGTERM για να τερματιστούν — απελευθερώνοντας έτσι δεσμευμένους πόρους — και να δημιουργεί σταθερότητα γύρω από την εφαρμογή NodeJS που φιλοξενείται στον web server.
Σκοπός
Η εκτέλεση NodeJS εφαρμογών σε περιβάλλον cPanel είναι διαφορετική από την τοπική εκτέλεση NodeJS apps. Κάποιες διεργασίες μπορεί να αποτύχουν, προκαλώντας το σύστημα ελέγχου διεργασιών του cPanel να εκκινήσει μια νέα NodeJS instance – ή διεργασίες που θα έπρεπε να έχουν τερματιστεί, να παραμένουν “κολλημένες” ως ghost processes. Με τον καιρό, αυτό μπορεί να καταναλώσει όλους τους πόρους, μέχρι το Resource Monitor του cPanel να μπλοκάρει περαιτέρω χρήση.
cleanup_orphans.sh [options] 'SEARCHSTRING'
Επιλογές:
-v Αναλυτική λειτουργία (verbose)
-d Dry-run - δείχνει τη συμπεριφορά χωρίς να κάνει αλλαγές
-f Force kill - χρησιμοποιεί SIGKILL αντί για SIGTERM
-h Βοήθεια (αυτό το μήνυμα χρήσης)
Προεπιλεγμένο SEARCHSTRING: 'lsnode:/home/$USER/'
Αν το script εκτελεστεί χωρίς 'SEARCHSTRING', θα περάσει μέσα από
τον εσωτερικό πίνακα των domains (ονόματα φακέλων προστεθέντα στη
συμβολοσειρά αναζήτησης) για να καθαρίσει κάθε 'domain' ξεχωριστά.
Αν το script εκτελεστεί με συγκεκριμένο 'SEARCHSTRING' ως είσοδο, το προεπιλεγμένο SEARCHSTRING θα αντικατασταθεί από αυτό που δώσατε.
Διαφορετικά, το script θα επαναλαμβάνει τη διαδικασία για κάθε domain στον εσωτερικό πίνακα (array), καθαρίζοντας κάθε “domain” ξεχωριστά.
Καταγραφή (Logging)
Έχει ενσωματωθεί καταγραφή, ώστε να υπάρχει ιστορικό — μπορείτε έτσι να βλέπετε πόσες διεργασίες διαχειρίστηκε. Ωστόσο, υπερβολική καταγραφή μπορεί να δημιουργήσει νέο πρόβλημα, όπως εξάντληση του διαθέσιμου χώρου. Η λύση είναι να περιοριστεί η καταγραφή σε δύο αρχεία, το καθένα με έως 1000 γραμμές.
Εφαρμογή σε περιβάλλον cPanel
- Αντιγράψτε το script “ως έχει” στον τοπικό σας δίσκο.
- Το script περιέχει τον παρακάτω πίνακα (associative array) με τα root folder names όλων των Node.js εφαρμογών σας στο cPanel:
Επεξεργαστείτε τον πίνακα ώστε να ταιριάζει στη δική σας φιλοξενία.declare -A domains domains[1]='mydomain.com' domains[2]='api.mydomain.com' domains[3]='dev.mydomain.com' domains[4]='test.mydomain.com' - Επαληθεύστε ότι το SEARCHSTRING περιέχει αυτό που θέλετε να αναζητήσει το script:
SEARCHSTRING="lsnode:/home/$USER/" - Ρυθμίστε το μέγεθος του log αν επιθυμείτε. Αυτό είναι το κομμάτι που χειρίζεται το μέγεθος και την εναλλαγή (rotation) των log αρχείων:
# rotate log - διατήρηση μεγέθους log σε αποδεκτό όριο LOGSIZE=$(cat $LOGDIR/$LOGFILE | wc -l) if [ $LOGSIZE -gt 1000 ]; then mv -f $LOGDIR/$LOGFILE $LOGDIR/$LOGFILE.1 fi - Αν θέλετε, αλλάξτε το LOGDIR – από προεπιλογή αποθηκεύει τα logs στον ίδιο φάκελο με το script.
- Δημιουργήστε έναν φάκελο στον web host σας για τα δικά σας scripts – για παράδειγμα:
/cronscripts. - Αντιγράψτε το προσαρμοσμένο
cleanup_orphans.shστο φάκελο του web host:/cronscripts/cleanup_orphans.sh. - Προσθέστε ένα cron job στο cPanel. Προτείνεται να το εκτελείτε τακτικά, π.χ. κάθε 5–30 λεπτά (ανάλογα με τον φόρτο που δημιουργεί “ορφανές” διεργασίες).
Παράδειγμα:*/5 * * * * /home/infoqrco/cronscripts/cleanup_orphans.sh - Παρακολουθήστε την πρώτη εκτέλεση· δοκιμάστε τις επιλογές -v (verbose) και -d (dry-run). Ελέγξτε ότι δημιουργείται το αρχείο log και ότι το cron job εκτελείται όπως αναμένεται.
Έτοιμο! Οι “ορφανές” διεργασίες Node.js πλέον διαχειρίζονται αυτόματα.
Αρχικός οδηγός από έναν από τους έξυπνους πελάτες μας ;-) : https://github.com/jlmantov/shellscripts/blob/main/docs/cleanup_orphans.md