Pokretanje Basha u detalje

Ako ste pronašli ovu stranicu putem pretraživanja, sigurno pokušavate riješiti neki problem s pokretanjem basha.

Možda vaša bash okruženje ne postavlja varijablu okruženja i ne razumijete zašto. Možda ste nešto umetnuli u razne bash inicijalizacijske datoteke ili profile, ili u sve datoteke nasumice, dok to nije proradilo.

U svakom slučaju, smisao ove beleške je da na najjednostavniji način izložimo postupak pokretanja basha kako biste mogli riješiti probleme.

Dijagram

Ova blok-diagram sumira sve procese prilikom pokretanja basha.

Pokretanje Basha u detalje

Sada ćemo detaljnije razmotriti svaki deo.

Shell za prijavu?

Prvo morate odabrati da li se nalazite u shellu za prijavu (login shell) ili ne.

Shell za prijavu je prvi shell u koji ulazite prilikom prijave u interaktivnu sesiju. Shell za prijavu ne zahteva unos korisničkog imena i lozinke. Možete prisiliti pokretanje shella za prijavu dodavanjem zastavice --login pri pozivu bash, na primjer:

bash --login

Shell za prijavu postavlja osnovno okruženje prilikom prvog pokretanja bash shella.

Interaktivni?

Zatim određujete je li shell interaktivan ili nije.

To možete provjeriti prisutnošću varijable PS1 (ona postavlja funkciju unosa komandi):

if [ "${PS1-}" ]; then
  echo interactive
else
  echo non-interactive
fi

Ili provjeriti je li postavljen parametar -i, s pomoću specijalne varijable crta - u bash-u, na primer:

$ echo $-

Ako u izlazu postoji simbol i, tada je shell interaktivan.

U shellu za prijavu?

Ako se nalazite u shellu za prijavu, bash traži datoteku /etc/profile i pokreće je ako postoji.

Zatim traži bilo koju od ove tri datoteke u sledećem redosledu:

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

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

U interaktivnom shellu?

Ako se nalazite u interaktivnom shellu bez prijave (non-login shell), pretpostavlja se da ste već bili u shellu za prijavu, okruženje je postavljeno i biće nasleđeno.

U tom slučaju se redom izvršavaju sledeće dve datoteke, ako postoje:

/etc/bash.bashrc
~/.bashrc

Ni jedna opcija?

Ako se ne nalazite ni u shellu za prijavu, ni u interaktivnom shellu, vaše okruženje će biti potpuno prazno. To izaziva veliku konfuziju (vidi u nastavku o cron zadacima).

U tom slučaju bash gleda na varijablu BASH_ENV vašeg okruženja i kreira odgovarajuću datoteku koja je tamo određena.

Tipične poteškoće i empirijska pravila

Cron zadaci

U 95% slučajeva, debagiranje pokretanja basa povezano je s tim da planirana zadaća ne radi onako kako se očekuje.

Ova prokleta zadaća radi normalno kada je pokrenem iz naredbenog retka, ali neuspijeva kada se pokrene u crontab-u..

Ovdje dva razloga:

  • Planirane zadaće nisu interaktivne.
  • Za razliku od skripti u naredbenom retku, planirane zadaće ne nasljeđuju okruženje ljuske.

Obično ne primjećujete ili vas nije briga što skripta ljuske nije interaktivna, jer se okruženje nasljeđuje iz interaktivne ljuske. To znači da su sve PATH i alias konfigurirane onako kako očekujete.

Zato često morate postaviti specifične PATH za planiranu zadaću, kao ovdje:

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

Skripte koje se međusobno pozivaju

Još jedan uobičajen problem nastaje kada su skripte pogrešno postavljene da se međusobno pozivaju. Na primjer, /etc/profile obrađuje se prema ~/bashrc.

Obično se to događa kada je netko pokušao popraviti neku pogrešku i činilo se da sve radi. Nažalost, kada trebate razdvojiti te različite tipove sesija, javljaju se novi problemi.

Docker slika u sandboxu

Da bih eksperimentirao s pokretanjem ljuske, stvorio sam Docker sliku koju mogu koristiti za debagiranje pokretanja ljuske u sigurnom okruženju.

Pokretanje:

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

Dockerfile se nalazi ovdje.

Za prisilan login i imitaciju login ljuske:

$ bash --login

Za provjeru skupa varijabli BASH_ENV:

$ env | grep BASH_ENV

Za debagiranje crontab svake minute izvršit će se jednostavna skripta (u /root/ascript):

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

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster