Běh Bash v detailu

Pokud jste našli tuto stránku ve vyhledávání, pravděpodobně se snažíte vyřešit nějaký problém s běžícím bashem.

Možná vaše prostředí bash nenastavuje proměnnou prostředí a vy nechápete proč. Možná jste něco zapíchli do různých zaváděcích souborů nebo profilů bash nebo do všech souborů náhodně, dokud to nefungovalo.

V každém případě je smyslem této poznámky co nejjednodušeji rozložit postup spuštění bashe, abyste se mohli vypořádat s problémy.

Диаграмма

Tento vývojový diagram shrnuje všechny procesy při spuštění bash.

Běh Bash v detailu

Nyní se na jednotlivé části podíváme blíže.

Přihlašovací shell?

Nejprve si musíte vybrat, zda jste v přihlašovacím shellu nebo ne.

Přihlašovací shell je první shell, který zadáte, když se přihlašujete k interaktivní relaci. Přihlašovací shell nevyžaduje uživatelské jméno a heslo. Spuštění přihlašovacího shellu můžete vynutit přidáním příznaku --login při zavolání bash, Například:

bash --přihlášení

Přihlašovací shell nastaví základní prostředí při prvním spuštění bash shellu.

Interaktivní?

Poté určíte, zda je shell interaktivní nebo ne.

To lze zkontrolovat přítomností proměnné PS1 (nainstaluje funkci zadávání příkazů):

if [ "${PS1-}" ]; pak echo interaktivní else echo neinteraktivní fi

Nebo se podívejte, zda je tato možnost nastavena -ipomocí speciální proměnné pomlčky - v bash, například:

$echo$-

Pokud je ve výstupu symbol i, pak je shell interaktivní.

V přihlašovacím shellu?

Pokud jste v přihlašovacím prostředí, bash hledá soubor /etc/profile a běží, pokud existuje.

Poté vyhledá kterýkoli z těchto tří souborů v následujícím pořadí:

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

Když jednoho najde, spustí ho a ostatní přeskočí.

V interaktivním prostředí?

Pokud jste v nepřihlašovacím prostředí, předpokládá se, že jste již byli v přihlašovacím prostředí, prostředí je nakonfigurováno a bude zděděno.

V tomto případě jsou následující dva soubory spuštěny v pořadí, pokud existují:

/etc/bash.bashrc ~/.bashrc

Žádná možnost?

Pokud nejste v přihlašovacím ani interaktivním prostředí, vaše prostředí bude skutečně prázdné. To způsobuje spoustu zmatků (viz níže o úlohách cron).

V tomto případě se bash dívá na proměnnou BASH_ENV prostředí a vytvoří odpovídající soubor, který je zde zadán.

Běžné potíže a pravidla palce

cron pracovní místa

V 95 % případů, kdy ladím spouštění bash, je to proto, že úloha cron neběží podle očekávání.

Tenhle zatracený úkol funguje dobře, když jej spustím na příkazovém řádku, ale selže, když jej spustím v crontab.

Zde ze dvou důvodů:

  • Cron úlohy nejsou interaktivní.
  • Na rozdíl od skriptů příkazového řádku úlohy cron nedědí prostředí shellu.

Obvykle si nevšimnete nebo vás nezajímá, že skript shellu není interaktivní, protože prostředí dědí z interaktivního shellu. To znamená, že všechno PATH и alias nakonfigurovaný tak, jak byste očekávali.

Často je proto nutné nastavit konkrétní PATH pro úlohu cronu jako zde:

* * * * * PATH=${PATH}:/cesta/k/mému/programu/složce můjprogram

Skripty se navzájem volají

Dalším běžným problémem je, když jsou skripty mylně nakonfigurovány tak, aby se navzájem volaly. Například, /etc/profile apeluje na ~/.bashrc.

To se obvykle stává, když se někdo pokusil opravit nějakou chybu a zdálo se, že vše funguje. Bohužel, když potřebujete oddělit tyto různé typy relací, vyvstávají nové problémy.

Obrázek Sandboxed Docker

Abych experimentoval se spuštěním shellu, vytvořil jsem obraz Dockeru, který lze použít k ladění běhu shellu v zabezpečeném prostředí.

Zahájení:

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

Dockerfile se nachází zde.

Chcete-li vynutit přihlášení a simulovat přihlašovací shell:

$ bash --login

Chcete-li otestovat sadu proměnných BASH_ENV:

$ env | grep BASH_ENV

Pro ladění crontab každou minutu bude spuštěn jednoduchý skript (in /root/ascript):

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

Zdroj: www.habr.com

Přidat komentář