Rularea Bash în detaliu

Dacă ați găsit această pagină într-o căutare, probabil că încercați să rezolvați o problemă cu rularea bash.

Poate că mediul tău bash nu setează o variabilă de mediu și nu înțelegi de ce. Este posibil să fi blocat ceva în diferite fișiere sau profiluri de boot bash sau în toate fișierele la întâmplare până când a funcționat.

În orice caz, scopul acestei note este de a stabili procedura de pornire a bash cât mai simplu posibil, astfel încât să puteți face față problemelor.

Диаграмма

Această diagramă de flux rezumă toate procesele când rulează bash.

Rularea Bash în detaliu

Acum să aruncăm o privire mai atentă la fiecare parte.

Conectare Shell?

Mai întâi trebuie să alegeți dacă vă aflați în shell-ul de conectare sau nu.

Shell-ul de conectare este primul shell pe care îl introduceți când vă conectați pentru o sesiune interactivă. Shell-ul de conectare nu necesită un nume de utilizator și o parolă. Puteți forța shell-ul de conectare să înceapă prin adăugarea unui steag --login când chemat bash, de exemplu:

bash --login

Shell-ul de conectare setează mediul de bază atunci când porniți pentru prima dată shell-ul bash.

Interactiv?

Apoi determinați dacă shell-ul este interactiv sau nu.

Acest lucru poate fi verificat prin prezența variabilei PS1 (instalează funcția de introducere a comenzii):

dacă [ "${PS1-}" ]; apoi echo interactiv else echo non-interactiv fi

Sau vezi dacă opțiunea este setată -i, folosind o variabilă cratima specială - în bash, de exemplu:

$echo$-

Dacă există un simbol în ieșire i, atunci shell-ul este interactiv.

În shell-ul de conectare?

Dacă vă aflați într-un shell de autentificare, atunci bash caută fișierul /etc/profile și rulează dacă există.

Apoi caută oricare dintre aceste trei fișiere în următoarea ordine:

~/.bash_profile ~/.bash_login ~/.profile

Când găsește unul, îl pornește și îi sare peste celelalte.

Într-un shell interactiv?

Dacă vă aflați într-un shell non-login, se presupune că ați fost deja într-un shell de autentificare, mediul este configurat și va fi moștenit.

În acest caz, următoarele două fișiere sunt executate în ordine, dacă există:

/etc/bash.bashrc ~/.bashrc

Nicio opțiune?

Dacă nu vă aflați nici într-un shell de autentificare, nici într-un shell interactiv, atunci mediul dvs. va fi într-adevăr gol. Acest lucru provoacă multă confuzie (vezi mai jos despre joburile cron).

În acest caz, bash se uită la variabilă BASH_ENV mediul dumneavoastră și creează fișierul corespunzător specificat acolo.

Dificultăți comune și reguli generale

joburi cron

95% din timp depanez pornirea bash este pentru că jobul cron nu rulează așa cum era de așteptat.

Această sarcină afurisită funcționează bine când îl rulez pe linia de comandă, dar eșuează când îl rulez în crontab.

Aici doua motive:

  • Joburile Cron nu sunt interactive.
  • Spre deosebire de scripturile din linia de comandă, joburile cron nu moștenesc mediul shell.

De obicei, nu veți observa sau vă va păsa că un script shell nu este interactiv, deoarece mediul moștenește din shell-ul interactiv. Asta înseamnă că totul PATH и alias configurat așa cum v-ați aștepta.

Acesta este motivul pentru care este adesea necesar să se stabilească un anumit PATH pentru o sarcină cron ca aici:

* * * * * PATH=${PATH}:/calea/la/programul/meu/dosarul programul meu

Scripturi care se cheamă unul pe altul

O altă problemă comună este atunci când scripturile sunt configurate din greșeală pentru a se apela reciproc. De exemplu, /etc/profile atrage ~/.bashrc.

Acest lucru se întâmplă de obicei când cineva a încercat să repare o eroare și totul părea să funcționeze. Din păcate, atunci când trebuie să separați aceste tipuri diferite de sesiuni, apar noi probleme.

Imagine Docker cu nisip

Pentru a experimenta rularea unui shell, am creat o imagine Docker care poate fi folosită pentru a depana rularea unui shell într-un mediu securizat.

Lansa:

$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash

Dockerfile este localizat aici.

Pentru a forța autentificarea și a simula un shell de conectare:

$ bash --login

Pentru a testa un set de variabile BASH_ENV:

$ env | grep BASH_ENV

Pentru depanare crontab un script simplu va fi executat în fiecare minut (în /root/ascript):

$ crontab -l
$ cat /var/log/script.log

Sursa: www.habr.com

Adauga un comentariu