Vyhledávání na webu

Porozumění a učení se základnímu skriptování Shell a odstraňování problémů se souborovým systémem Linux – část 10


Linux Foundation spustila certifikaci LFCS (Linux Foundation Certified Sysadmin), zcela novou iniciativu, jejímž účelem je umožnit jednotlivcům kdekoli (a kdekoli) získat certifikaci v základních až středně pokročilých provozní podpora pro systémy Linux, která zahrnuje podporu běžících systémů a služeb spolu s celkovým monitorováním a analýzou, plus inteligentní rozhodování, pokud jde o předkládání problémů vyšším týmům podpory.

Podívejte se na následující video, které vás provede úvodem do certifikačního programu Linux Foundation.

Toto je poslední článek (část 10) této dlouhé série s 10 návody. V tomto článku se zaměříme na základní skriptování shellu a řešení problémů se souborovými systémy Linux. Obě témata jsou vyžadována pro certifikační zkoušku LFCS.

Pochopení terminálů a shellů

Nejprve si ujasněme několik pojmů.

  1. Shell je program, který přijímá příkazy a dává je operačnímu systému ke spuštění.
  2. Terminál je program, který nám jako koncovým uživatelům umožňuje interakci s shellem. Jedním příkladem terminálu je terminál GNOME, jak je znázorněno na obrázku níže.

Když poprvé spustíme shell, zobrazí se příkazový řádek (také známý jako příkazový řádek), který nám říká, že shell je připraven začít přijímat příkazy ze svého standardního vstupního zařízení, kterým je obvykle klávesnice.

Možná budete chtít nahlédnout do jiného článku v této sérii (Použití příkazu k vytváření, úpravám a manipulaci se soubory – část 1), kde najdete některé užitečné příkazy.

Linux poskytuje řadu možností pro shelly, přičemž nejběžnější jsou následující:

bash Shell

Bash znamená Bourne Again SHell a je výchozím shellem projektu GNU. Obsahuje užitečné funkce z Korn shellu (ksh) a C shellu (csh) a nabízí několik vylepšení současně. Toto je výchozí shell používaný distribucemi pokrytými certifikací LFCS a je to shell, který budeme používat v tomto tutoriálu.

sh Shell

Bourne SHell je nejstarší shell, a proto byl po mnoho let výchozím shellem mnoha operačních systémů podobných UNIXu.

ksh Shell

Korn SHell je unixový shell, který byl vyvinut Davidem Kornem v Bell Labs na počátku 80. let. Je zpětně kompatibilní s Bourne shellem a obsahuje mnoho funkcí shellu C.

Shell skript není nic víc a nic méně než textový soubor přeměněný na spustitelný program, který kombinuje příkazy, které jsou spouštěny shellem jeden po druhém.

Základní skriptování Shell

Jak již bylo zmíněno dříve, shell skript se rodí jako prostý textový soubor. Lze je tedy vytvářet a upravovat pomocí našeho preferovaného textového editoru. Možná budete chtít zvážit použití vi/m (viz Použití editoru vi – část 2 této série), které pro vaše pohodlí obsahuje zvýraznění syntaxe.

Zadejte následující příkaz pro vytvoření souboru s názvem myscript.sh a stiskněte Enter.

vim myscript.sh

Úplně první řádek skriptu shellu musí být následující (známý také jako shebang).

#!/bin/bash

Operačnímu systému „řekne“ název interpretu, který by měl být použit ke spuštění následujícího textu.

Nyní je čas přidat naše příkazy. Účel každého příkazu nebo celého skriptu můžeme objasnit přidáním komentářů. Všimněte si, že shell ignoruje řádky začínající znakem libry # (vysvětlující komentáře).

#!/bin/bash
echo This is Part 10 of the 10-article series about the LFCS certification
echo Today is $(date +%Y-%m-%d)

Jakmile je skript napsán a uložen, musíme jej učinit spustitelným.

chmod 755 myscript.sh

Před spuštěním našeho skriptu si musíme říci pár slov o proměnné prostředí ` PATH. Pokud běžíme,

echo $PATH

z příkazového řádku uvidíme obsah ` PATH: seznam adresářů oddělených dvojtečkou, které se prohledávají, když zadáme název spustitelného programu. Říká se jí proměnná prostředí, protože je součástí prostředí shellu – sady informací, které jsou dostupné pro shell a jeho podřízené procesy při prvním spuštění shellu.

Když napíšeme příkaz a stiskneme Enter, shell prohledá všechny adresáře uvedené v proměnné ` PATH a provede první nalezenou instanci. Podívejme se na příklad,

Pokud existují dva spustitelné soubory se stejným názvem, jeden v /usr/local/bin a další v /usr/bin, bude spuštěn ten v prvním adresáři za prvé, zatímco na druhé nebude brán zřetel.

Pokud jsme skript neuložili do jednoho z adresářů uvedených v proměnné ` PATH, musíme k názvu souboru připojit ./, aby se mohl spustit to. Jinak jej můžeme spustit stejně jako s běžným příkazem.

pwd
./myscript.sh
cp myscript.sh ../bin
cd ../bin
pwd
myscript.sh

Podmínky

Kdykoli potřebujete specifikovat různé kroky, které mají být provedeny ve skriptu shellu, jako výsledek úspěchu nebo selhání příkazu, použijete k definování takových podmínek konstrukt if. Jeho základní syntaxe je:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Kde CONDITION může být jedna z následujících (zde jsou citovány pouze nejčastější podmínky) a vyhodnotí se jako pravdivé, když:

  1. [ -a soubor ] → soubor existuje.
  2. [ -d soubor ] → soubor existuje a je adresářem.
  3. [ -f soubor ] →soubor existuje a je to běžný soubor.
  4. [ -u soubor ] →soubor existuje a jeho bit SUID (set user ID) je nastaven.
  5. [ -g soubor ] →soubor existuje a jeho bit SGID je nastaven.
  6. [ -k soubor ] →soubor existuje a jeho lepivý bit je nastaven.
  7. [ -r soubor ] →soubor existuje a je čitelný.
  8. [ -s soubor ]→ soubor existuje a není prázdný.
  9. [ -w soubor ]→soubor existuje a lze do něj zapisovat.
  10. [ -x soubor ] má hodnotu true, pokud soubor existuje a je spustitelný.
  11. [ řetězec1=řetězec2 ] → řetězce jsou stejné.
  12. [ řetězec1 != řetězec2 ] →řetězce nejsou stejné.

[ int1 op int2 ] by mělo být součástí předchozího seznamu, zatímco položky, které následují (například -eq –> má hodnotu true, pokud int1 se rovná int2.) by měl být seznam „dětí“ [ int1 op int2 ] kde op je jedním z následujících operátorů porovnání.

  1. -eq –> je pravdivé, pokud se int1 rovná int2.
  2. -ne –> true, pokud se int1 nerovná int2.
  3. -lt –> true, pokud je int1 menší než int2.
  4. -le –> true, pokud je int1 menší nebo rovno int2.
  5. -gt –> true, pokud je int1 větší než int2.
  6. -ge –> true, pokud je int1 větší nebo rovno int2.

Pro smyčky

Tato smyčka umožňuje provést jeden nebo více příkazů pro každou hodnotu v seznamu hodnot. Jeho základní syntaxe je:

for item in SEQUENCE; do 
		COMMANDS; 
done

Kde item je generická proměnná, která představuje každou hodnotu v SEQUENCE během každé iterace.

Zatímco smyčky

Tato smyčka umožňuje provádět řadu opakujících se příkazů, pokud se řídicí příkaz provádí se stavem ukončení rovným nule (úspěšně). Jeho základní syntaxe je:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Kde EVALUATION_COMMAND může být jakýkoli příkaz (příkazy), který může skončit úspěšně (0) nebo neúspěšně (jiný než 0), a stav EXECUTE_COMMANDS může být jakýkoli program, skript nebo konstrukce shellu, včetně dalších vnořených smyček.

Dát to všechno dohromady

Použití konstrukce if a cyklu for si ukážeme na následujícím příkladu.

Určení, zda služba běží v distribuci založené na systemd

Vytvořme soubor se seznamem služeb, které chceme na první pohled sledovat.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Náš skript by měl vypadat takto.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

for service in $(cat myservices.txt); do
    	systemctl status $service | grep --quiet "running"
    	if [ $? -eq 0 ]; then
            	echo $service "is [ACTIVE]"
    	else
            	echo $service "is [INACTIVE or NOT INSTALLED]"
    	fi
done

Pojďme si vysvětlit, jak skript funguje.

1). Cyklus for čte soubor myservices.txt jeden prvek LIST po druhém. Tento jediný prvek je označen generickou proměnnou s názvem service. LIST je naplněn výstupem,

cat myservices.txt

2). Výše uvedený příkaz je uzavřen v závorkách a předchází mu znak dolaru, který označuje, že by měl být vyhodnocen, aby naplnil SEZNAM, který budeme opakovat.

3). Pro každý prvek LIST (to znamená každou instanci proměnné služby) bude proveden následující příkaz.

systemctl status $service | grep --quiet "running"

Tentokrát musíme před naši generickou proměnnou (která představuje každý prvek v LIST) uvést znak dolaru, který označuje, že se jedná o proměnnou, a proto by měla být použita její hodnota v každé iteraci. Výstup je pak veden potrubím do grep.

Příznak –quiet se používá k zabránění grep v zobrazení řádků, kde se objevuje slovo běžící. Když k tomu dojde, výše uvedený příkaz vrátí stav ukončení 0 (reprezentovaný $? v konstrukci if), čímž ověří, že služba běží.

Stav ukončení jiný než 0 (což znamená, že spuštěné slovo nebylo nalezeno ve výstupu systemctl status $service) znamená, že služba není běh.

Mohli bychom jít ještě o krok dále a zkontrolovat existenci souboru myservices.txt ještě předtím, než se pokusíme vstoupit do cyklu for.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

if [ -f myservices.txt ]; then
    	for service in $(cat myservices.txt); do
            	systemctl status $service | grep --quiet "running"
            	if [ $? -eq 0 ]; then
                    	echo $service "is [ACTIVE]"
            	else
                    	echo $service "is [INACTIVE or NOT INSTALLED]"
            	fi
    	done
else
    	echo "myservices.txt is missing"
fi
Ping na sérii síťových nebo internetových hostitelů pro statistiku odpovědí

Možná budete chtít udržovat seznam hostitelů v textovém souboru a pomocí skriptu tu a tam určit, zda jsou pingovatelné nebo ne (klidně nahraďte obsah myhosts a vyzkoušejte sami ).

Vestavěný příkaz read shell říká cyklu while, aby četl myhosts řádek po řádku, a přiřazuje obsah každého řádku proměnnému hostiteli, který je pak předán příkazu ping.

#!/bin/bash

This script is used to demonstrate the use of a while loop

while read host; do
    	ping -c 2 $host
done < myhosts

Přečtěte si také:

  1. Naučte se Shell Scripting: Průvodce od nováčků ke správci systému
  2. 5 Shell skriptů pro výuku Shell programování

Odstraňování problémů se souborovým systémem

Přestože je Linux velmi stabilní operační systém, pokud se z nějakého důvodu zhroutí (například kvůli výpadku napájení), jeden (nebo více) vašich souborových systémů nebude správně odpojen, a proto budou automaticky kontrolovány na chyby, když Linux je restartován.

Navíc pokaždé, když se systém zavede během normálního spouštění, vždy před připojením zkontroluje integritu souborových systémů. V obou případech se to provádí pomocí nástroje s názvem fsck („kontrola systému souborů “).

fsck nejen zkontroluje integritu souborových systémů, ale také se pokusí opravit poškozené souborové systémy, pokud k tomu dostane pokyn. V závislosti na závažnosti poškození může fsck uspět nebo ne; když se tak stane, obnovené části souborů se umístí do adresáře ztraceno+nalezeno, který se nachází v kořenovém adresáři každého souborového systému.

V neposlední řadě musíme poznamenat, že k nesrovnalostem může dojít také v případě, že se pokusíme vyjmout USB disk, když na něj operační systém stále zapisuje, a může dojít i k poškození hardwaru.

Základní syntaxe fsck je následující:

fsck [options] filesystem
Kontrola chyb v souborovém systému a pokus o automatickou opravu

Abychom mohli zkontrolovat souborový systém pomocí fsck, musíme jej nejprve odpojit.

mount | grep sdg1
umount /mnt
fsck -y /dev/sdg1

Kromě parametru -y můžeme použít volbu -a k automatické opravě souborových systémů bez kladení otázek a vynutit kontrolu, i když souborový systém vypadá čistý.

fsck -af /dev/sdg1

Pokud nás zajímá pouze zjištění, co je špatně (aniž bychom se prozatím snažili cokoli opravit), můžeme spustit fsck s volbou -n, která vypíše problémy se souborovým systémem na standardní výstup.

fsck -n /dev/sdg1

V závislosti na chybových zprávách ve výstupu fsck budeme vědět, zda se můžeme pokusit problém vyřešit sami, nebo jej eskalovat technickým týmům, aby provedly další kontroly hardwaru.

souhrn

Dostali jsme se na konec této série 10 článků, kde jsme se pokusili pokrýt základní doménové kompetence potřebné ke složení zkoušky LFCS.

Ze zřejmých důvodů není možné pokrýt každý jednotlivý aspekt těchto témat v jediném tutoriálu, a proto doufáme, že vás tyto články navedly na správnou cestu, abyste sami vyzkoušeli nové věci a pokračovali v učení.

Máte-li jakékoli dotazy nebo připomínky, jsou vždy vítány – neváhejte a napište nám prostřednictvím formuláře níže!