Pokretanje Bash-a u detalje

Ako ste pronašli ovu stranicu u pretrazi, vjerovatno pokušavate riješiti neku vrstu problema pokretanja bash-a.

Možda vaše bash okruženje ne postavlja varijablu okruženja i ne razumijete zašto. Možda ste zaglavili nešto u razne bash boot fajlove ili profile ili sve fajlove nasumice dok nije proradilo.

U svakom slučaju, poenta ovog posta je da bash startup učini što jednostavnijim kako biste se mogli nositi s problemima.

Dijagram

Ovaj dijagram toka sažima sve procese kada se bash pokrene.

Pokretanje Bash-a u detalje

Sada pogledajmo detaljnije svaki dio.

login shell?

Prvo morate odabrati da li ste u ljusci za prijavu ili ne.

Shell za prijavu je prva ljuska koju unesete kada se prijavite na interaktivnu sesiju. Shell za prijavu ne zahtijeva korisničko ime i lozinku. Možete prisiliti ljusku za prijavu da se pokrene dodavanjem zastavice --login kada je pozvan bash, na primjer:

bash --login

Shell za prijavu postavlja osnovno okruženje kada prvi put pokrenete bash shell.

Interaktivan?

Zatim određujete da li je ljuska interaktivna ili ne.

Ovo se može provjeriti prisustvom varijable PS1 (postavlja funkciju unosa komande):

if [ "${PS1-}" ]; zatim echo interaktivno else echo neinteraktivno fi

Ili pogledajte da li je opcija postavljena -i, koristeći posebnu varijablu crtice - u bash-u, na primjer:

$echo $-

Ako postoji simbol u izlazu i, tada je ljuska interaktivna.

U ljusci za prijavu?

Ako ste u ljusci za prijavu, bash traži datoteku /etc/profile i radi ako postoji.

Zatim traži bilo koju od ove tri datoteke sljedećim redoslijedom:

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

Kada pronađe jedan, pokreće ga i preskače ostale.

U interaktivnoj ljusci?

Ako ste u interaktivnoj ljusci bez prijave, pretpostavlja se da ste već bili u ljusci za prijavu, okruženje je postavljeno i bit će naslijeđeno.

U ovom slučaju, sljedeća dva fajla se izvršavaju redom, ako postoje:

/etc/bash.bashrc ~/.bashrc

Nema opcije?

Ako niste ni u ljusci za prijavu ni u interaktivnoj ljusci, tada će vaše okruženje zaista biti prazno. Ovo uzrokuje dosta zabune (pogledajte dolje za cron poslove).

U ovom slučaju, bash gleda na varijablu BASH_ENV vaše okruženje i kreira odgovarajuću datoteku koja je tamo navedena.

Tipične poteškoće i osnovna pravila

cron poslovi

95% mog bash startup otklanjanja grešaka je zbog toga što cron posao ne radi kako se očekivalo.

Ovaj prokleti zadatak radi dobro kada ga pokrenem iz komandne linije, ali ne uspijeva kada ga pokrenem iz crontab-a.

to je dva razloga:

  • cron poslovi nisu interaktivni.
  • Za razliku od skriptiranja komandne linije, cron poslovi ne nasljeđuju okruženje ljuske.

Obično ne primjećujete ili ne brinete da shell skripta nije interaktivna jer je okruženje naslijeđeno od interaktivne ljuske. To znači da sve PATH и alias konfigurisan kako biste očekivali.

Zbog toga je često potrebno utvrditi specifičnost PATH za cron zadatak kao što je ovaj:

* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram

Skripte se međusobno pozivaju

Još jedan čest problem je kada su skripte greškom podešene da se međusobno pozivaju. Na primjer, /etc/profile apeluje na ~/.bashrc.

Ovo se obično dešava kada je neko pokušao da ispravi neku vrstu greške i činilo se da sve funkcioniše. Nažalost, kada je u pitanju razdvajanje ovih različitih vrsta sesija, pojavljuju se novi problemi.

Docker slika u sandboxu

Kako bih eksperimentirao s pokretanjem ljuske, napravio sam Docker sliku koja se može koristiti za otklanjanje grešaka pri pokretanju ljuske u sigurnom okruženju.

Pokreni:

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

Dockerfile se nalazi ovdje.

Za prisilno prijavljivanje i simulaciju ljuske za prijavu:

$ bash --login

Za testiranje skupa varijabli BASH_ENV:

$ env | grep BASH_ENV

Za otklanjanje grešaka crontab jednostavna skripta će se izvršavati svake minute (u /root/ascript):

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

izvor: www.habr.com

Dodajte komentar