Εάν βρήκατε αυτήν τη σελίδα σε μια αναζήτηση, πιθανότατα προσπαθείτε να λύσετε κάποιο πρόβλημα με το running bash.
Ίσως το περιβάλλον bash σας να μην ορίζει μια μεταβλητή περιβάλλοντος και δεν καταλαβαίνετε γιατί. Μπορεί να έχετε κολλήσει κάτι σε διάφορα αρχεία ή προφίλ εκκίνησης του bash ή σε όλα τα αρχεία τυχαία μέχρι να λειτουργήσει.
Σε κάθε περίπτωση, το θέμα αυτής της σημείωσης είναι να ορίσετε τη διαδικασία για την έναρξη του bash όσο το δυνατόν πιο απλά, ώστε να μπορείτε να αντιμετωπίσετε προβλήματα.
Диаграмма
Αυτό το διάγραμμα ροής συνοψίζει όλες τις διεργασίες κατά την εκτέλεση του bash.
Τώρα ας ρίξουμε μια πιο προσεκτική ματιά σε κάθε μέρος.
Σύνδεση Shell;
Πρώτα πρέπει να επιλέξετε εάν βρίσκεστε στο κέλυφος σύνδεσης ή όχι.
Το κέλυφος σύνδεσης είναι το πρώτο κέλυφος που εισάγετε όταν συνδέεστε για μια διαδραστική περίοδο λειτουργίας. Το κέλυφος σύνδεσης δεν απαιτεί όνομα χρήστη και κωδικό πρόσβασης. Μπορείτε να αναγκάσετε το κέλυφος σύνδεσης να ξεκινήσει προσθέτοντας μια σημαία --login
κατά την κλήση bash
, για παράδειγμα:
bash --σύνδεση
Το κέλυφος σύνδεσης ρυθμίζει το βασικό περιβάλλον κατά την πρώτη εκκίνηση του κελύφους bash.
Διαδραστικό?
Στη συνέχεια προσδιορίζετε εάν το κέλυφος είναι διαδραστικό ή όχι.
Αυτό μπορεί να ελεγχθεί με την παρουσία της μεταβλητής PS1
(εγκαθιστά τη συνάρτηση εισαγωγής εντολών):
εάν [ "${PS1-}" ]; μετά ηχώ διαδραστικό άλλο ηχώ μη διαδραστικό fi
Ή δείτε αν έχει οριστεί η επιλογή -i
, χρησιμοποιώντας μια ειδική μεταβλητή παύλα -
στο bash, για παράδειγμα:
$echo$-
Εάν υπάρχει σύμβολο στην έξοδο i
, τότε το κέλυφος είναι διαδραστικό.
Στο κέλυφος σύνδεσης;
Εάν βρίσκεστε σε ένα κέλυφος σύνδεσης, τότε το bash αναζητά το αρχείο /etc/profile
και τρέχει αν υπάρχει.
Στη συνέχεια πραγματοποιεί αναζήτηση για οποιοδήποτε από αυτά τα τρία αρχεία με την ακόλουθη σειρά:
~/.bash_profile ~/.bash_login ~/.profile
Όταν βρει ένα, το ξεκινά και παρακάμπτει τα άλλα.
Σε ένα διαδραστικό κέλυφος;
Εάν βρίσκεστε σε ένα κέλυφος χωρίς σύνδεση, υποτίθεται ότι έχετε ήδη βρεθεί σε ένα κέλυφος σύνδεσης, το περιβάλλον έχει διαμορφωθεί και θα κληρονομηθεί.
Σε αυτήν την περίπτωση, τα ακόλουθα δύο αρχεία εκτελούνται με τη σειρά, εάν υπάρχουν:
/etc/bash.bashrc ~/.bashrc
Καμία επιλογή;
Εάν δεν βρίσκεστε ούτε σε κέλυφος σύνδεσης ούτε σε διαδραστικό κέλυφος, τότε το περιβάλλον σας θα είναι πράγματι κενό. Αυτό προκαλεί μεγάλη σύγχυση (δείτε παρακάτω σχετικά με τις εργασίες cron).
Σε αυτήν την περίπτωση, το bash εξετάζει τη μεταβλητή BASH_ENV
το περιβάλλον σας και δημιουργεί το αντίστοιχο αρχείο που καθορίζεται εκεί.
Συνήθεις δυσκολίες και πρακτικοί κανόνες
cron δουλειές
Το 95% των φορών που πραγματοποιώ εντοπισμό σφαλμάτων εκκίνησης του bash οφείλεται στο ότι η εργασία cron δεν εκτελείται όπως αναμένεται.
Αυτό το καταραμένο έργο λειτουργεί καλά όταν το εκτελώ στη γραμμή εντολών, αλλά αποτυγχάνει όταν το εκτελώ στο crontab.
Εδώ δύο λόγοι:
- Οι εργασίες Cron δεν είναι διαδραστικές.
- Σε αντίθεση με τα σενάρια γραμμής εντολών, οι εργασίες cron δεν κληρονομούν το περιβάλλον του κελύφους.
Συνήθως δεν θα παρατηρήσετε ή δεν θα νοιάζεστε ότι ένα σενάριο φλοιού δεν είναι διαδραστικό επειδή το περιβάλλον κληρονομεί από το διαδραστικό κέλυφος. Αυτό σημαίνει ότι τα πάντα PATH
и alias
έχει ρυθμιστεί όπως θα περιμένατε.
Αυτός είναι ο λόγος για τον οποίο είναι συχνά απαραίτητο να ορίσετε ένα συγκεκριμένο PATH
για μια cron εργασία όπως εδώ:
* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram
Σενάρια που καλούν το ένα το άλλο
Ένα άλλο κοινό πρόβλημα είναι όταν τα σενάρια έχουν ρυθμιστεί κατά λάθος ώστε να καλούν το ένα το άλλο. Για παράδειγμα, /etc/profile
απευθύνει έκκληση σε ~/.bashrc
.
Αυτό συμβαίνει συνήθως όταν κάποιος προσπάθησε να διορθώσει κάποιο σφάλμα και όλα έδειχναν να λειτουργούν. Δυστυχώς, όταν χρειάζεται να διαχωρίσετε αυτούς τους διαφορετικούς τύπους συνεδριών, προκύπτουν νέα προβλήματα.
Sandboxed εικόνα Docker
Για να πειραματιστώ με την εκτέλεση ενός κελύφους, δημιούργησα μια εικόνα Docker που μπορεί να χρησιμοποιηθεί για τον εντοπισμό σφαλμάτων που εκτελείται ένα κέλυφος σε ασφαλές περιβάλλον.
Εκκίνηση:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Το Dockerfile βρίσκεται
Για να αναγκάσετε τη σύνδεση και να προσομοιώσετε ένα κέλυφος σύνδεσης:
$ bash --login
Για να δοκιμάσετε ένα σύνολο μεταβλητών BASH_ENV
:
$ env | grep BASH_ENV
Για αποσφαλμάτωση crontab
ένα απλό σενάριο θα εκτελείται κάθε λεπτό (σε /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Πηγή: www.habr.com