A Bash indítása részletesen

Ha megtalálta ezt az oldalt a keresőben, valószínűleg valamilyen problémát próbál megoldani a bash indításával kapcsolatban.

Lehet, hogy a bash környezetében nem állítódik be a környezeti változó, és nem érti, miért. Lehet, hogy belepiszkált valamit a különböző bash indító fájlokba vagy a profilokba, vagy minden fájlba találomra, amíg nem működött.

Mindenesetre a bejegyzés célja, hogy a lehető legegyszerűbben ismertesse a bash indításának eljárását, hogy meg tudja oldani a problémákat.

Ábra

Ez az ábra összegzi az összes folyamatot a bash indításakor.

A Bash indítása részletesen

Most nézzük meg részletesebben mindegyik részt.

Bejelentkezési Shell?

Először ki kell választani, hogy bejelentkezési shell-ben van-e vagy sem.

A bejelentkezési shell az az első shell, amelybe belép, amikor interaktív munkamenetre lép. A bejelentkezési shell nem igényel felhasználónév és jelszó megadását. Kényszerítheti a bejelentkezési shell indítását a következő kapcsoló hozzáadásával: --login a meghíváskor: bash, például:

bash --login

A bejelentkezési shell beállítja az alap környezetet a bash shell első indítása során.

Interaktív?

Ezután meg kell határozni, hogy a shell interaktív-e vagy sem.

Ezt a következő változó létezésével ellenőrizheti: PS1 (ez beállítja a parancsbeviteli funkciót):

if [ "${PS1-}" ]; then
  echo interaktív
else
  echo nem interaktív
fi

Vagy megnézni, hogy be van-e állítva a változó: -i, a kötőjel speciális változójával - a bash-ben, például:

$ echo $-

Ha a kimenetben szerepel a karakter i, akkor a shell interaktív.

A bejelentkezési shell-ben van?

Ha bejelentkezési shell-ben van, a bash keresi a fájlt /etc/profile és elindítja, ha létezik.

Ezután keresi az alábbi három fájl egyikét a következő sorrendben:

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

Amikor talál egyet, megnyitja és a többit kihagyja.

Interaktív shell-ben?

Ha interaktív shell-ben van anélkül, hogy bejelentkezett volna (non-login shell), akkor feltételezhető, hogy már volt bejelentkezési shell-e, a környezet be van állítva és öröklődik.

Ebben az esetben az alábbi két fájlt futtatja sorrendben, ha léteznek:

/etc/bash.bashrc
~/.bashrc

Nincs egyik változat sem?

Ha sem bejelentkezési shell-ben, sem interaktív shell-ben nem tartózkodik, akkor a környezete valóban üres lesz. Ez nagy zűrzavart okozhat (lásd az alábbiakat a cron feladatokról).

Ebben az esetben a bash a környezeti változóra figyel: BASH_ENV és létrehozza a megadott fájlt.

Tipikus nehézségek és empirikus szabályok

Cron feladatok

A bash indítása esetén a problémáim 95%-a a cron feladatok nem várt működésével kapcsolatos.

Ez az átkos feladat normálisan működik, amikor a parancssorból indítom, de megbukik a crontab-ban való futtatáskor.

Itt két ok:

  • A cron feladatok nem interaktívak.
  • A parancssorbeli szkriptekkel ellentétben a cron feladatok nem öröklik a shell környezetet.

Általában nem veszed észre, és nem is törődsz azzal, hogy a shell szkript nem interaktív, mert a környezet az interaktív shell-től öröklődik. Ez azt jelenti, hogy minden PATH és alias úgy van beállítva, ahogy elvárnád.

Ezért gyakran meg kell határoznod egy konkrét PATH a cron feladathoz, mint itt:

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

Szkriptek, amelyek egymást hívják

Egy másik gyakori probléma, amikor a szkriptek véletlenül egymást hívják. Például, /etc/profile fordul ~/.bashrc.

Ez általában akkor történik, amikor valaki próbálta megoldani valamilyen hibát, és úgy tűnt, hogy minden működik. Sajnos, amikor ezeket a különböző típusú munkameneteket el kell különíteni, új problémák merülnek fel.

Docker kép homokozóban

A shell indításának kipróbálásához létrehoztam egy Docker képet, amely használható a shell indításának hibakeresésére biztonságos környezetben.

Indítás:

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

A Dockerfile található itt.

Kényszerített bejelentkezés és belépő shell szimuláció:

$ bash --login

A változók készletének ellenőrzéséhez BASH_ENV:

$ env | grep BASH_ENV

A hibakereséshez crontab minden percben egy egyszerű szkript fog futni (a /root/ascript):

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

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster