Startimi i Bash-it në detaje

Nëse e keni gjetur këtë faqe në kërkimin tuaj, ndoshta po përpiqeni të zgjidhni ndonjë problem me funksionimin e bash-it.

Mund të ndodhë që në ambientin tuaj, bash-i nuk po vendos një variabël mjedisor dhe nuk po kuptoni pse. Ndoshta keni futur diçka në skedarët e ndryshëm të ngarkimit të bash-it ose në profile, ose në të gjithë skedarët për të provuar deri sa të funksionojë.

Në çdo rast, qëllimi i këtij shënimi është t'ju paraqesë sa më thjesht procedurën për të drejtuar bash-in, për t'ju ndihmuar të zgjidhni problemet.

Diagrami

Ky diagram përmbledh të gjithë proceset gjatë lançimit të bash-it.

Startimi i Bash-it në detaje

Tani do të shqyrtojmë çdo pjesë më në detaje.

Shell Daten?

Së pari, duhet të zgjidhni nëse ndodheni në një shell hyrës (login shell) apo jo.

Shell hyrës është shell-i fillestar ku hyni në sistem gjatë një seance interaktive. Shell-i hyrës nuk kërkon hyrjen e emrit të përdoruesit dhe fjalëkalimit. Mund ta detyroni lançimin e shell-it hyrës duke shtuar flamurin --login kur thërrisni bash, për shembull:

bash --login

Shell-i hyrës konfiguroni mjedisin fillestar gjatë lançimit të parë të bash-it.

Interaktiv?

Pastaj, keni për të përcaktuar nëse shell-i është interaktiv apo jo.

Kjo mund të kontrollohet nga prania e variablës PS1 (ajo vendos funksionin e inputit të komandave):

if [ "${PS1-}" ]; then
  echo interaktiv
else
  echo jo-interaktiv
fi

Ose të shikoni nëse parametri është vendosur -i, me një variabël të veçantë të defishet - në bash, për shembull:

$ echo $-

Nëse në dalje ka karakterin i, atëherë shell-i është interaktiv.

NĂ« shell-in e hyrjes?

Nëse ndodhesh në shell-in e hyrjes, atëherë bash kërkon skedarin /etc/profile dhe e ekzekuton, nëse ekziston.

Pastaj kërkon cilin nga këto tre skedarë në rendin e mëposhtëm:

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

Kur gjen një, e ekzekuton atë dhe kalon tek të tjerët.

NĂ« shell-in interaktiv?

Nëse je në një shell interaktive pa hyrje në sistem (non-login shell), supozohet që ke qenë tashmë në shell-in e hyrjes, ambienti është konfiguruar dhe do të trashëgohet.

Në këtë rast, ekzekutohen rregullisht këta dy skedarë, nëse ekzistojnë:

/etc/bash.bashrc
~/.bashrc

Asnjë opsion?

Nëse nuk je as në një shell hyrjeje, as në një shell interaktive, atëherë ambienti yt në të vërtetë do të jetë bosh. Kjo ndikon në krijimin e konfuzionit të madh (shih më poshtë për detyrat cron).

Në këtë rast, bash shikon në variablin BASH_ENV të ambientit tënd dhe krijon skedarin përkatës që është specifikuar atje.

Vështirësitë tipike dhe rregullat empirike

Detyrat cron

Në 95% të rasteve, debugimi i ekzekutimit të bash është i lidhur me faktin se detyra cron nuk funksionon siç pritej.

Kjo detyrë e mallkuar funksionon normalisht kur e ekzekutoj në komandën e linjës, por dështim në ekzekutimin në crontab.

Këtu dy arsye:

  • Detyrat cron nuk janĂ« interaktive.
  • Ndryshe nga skriptet nĂ« komandĂ«n e linjĂ«s, detyrat cron nuk trashĂ«gojnĂ« ambientin e molluskit.

Zakonisht nuk e vëreni ose nuk ju intereson që skripti i molluskit nuk është interaktiv, sepse ambienti trashëgohet nga mollusku interaktiv. Kjo do të thotë se të gjitha PATH dhe alias janë konfiguruar siç e prisni.

Kjo është arsyeja pse shpesh duhet të vendosni një PATH për detyrën cron, si këtu:

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

Skripte që thërrasin njëri-tjetrin

Një tjetër problem i zakonshëm ndodh kur skriptet gabimisht janë të konfiguruara për të thirrur njëri-tjetrin. Për shembull, /etc/profile i drejtohet ~/.bashrc.

Zakonisht ndodh kështu kur dikush ka provuar të rregullonte një gabim dhe duket se gjithçka punon. Fatkeqësisht, kur duhet të ndahen këto lloje të seancave, lindin probleme të reja.

Imazhi Docker në sandbox

Për të eksperimentuar me nisjen e shell-it, krijova një imazh Docker që mund të përdoret për debugin e nisjes së shell-it në një mjedis të sigurt.

Nisja:

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

Dockerfile ndodhet këtu.

Për një login të detyrueshëm dhe imitim të shell-it të hyrjes:

$ bash --login

Për të kontrolluar grupin e variablave BASH_ENV:

$ env | grep BASH_ENV

Për debugin crontab çdo minutë do të ekzekutohet një skript i thjeshtë (në /root/ascript):

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

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster