Το Running Bash αναλυτικά

Εάν βρήκατε αυτήν τη σελίδα σε μια αναζήτηση, πιθανότατα προσπαθείτε να λύσετε κάποιο πρόβλημα με το running bash.

Ίσως το περιβάλλον bash σας να μην ορίζει μια μεταβλητή περιβάλλοντος και δεν καταλαβαίνετε γιατί. Μπορεί να έχετε κολλήσει κάτι σε διάφορα αρχεία ή προφίλ εκκίνησης του bash ή σε όλα τα αρχεία τυχαία μέχρι να λειτουργήσει.

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

Диаграмма

Αυτό το διάγραμμα ροής συνοψίζει όλες τις διεργασίες κατά την εκτέλεση του bash.

Το Running 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

Προσθέστε ένα σχόλιο