Weboldal keresés

Az alapvető shell-parancsfájlok és a Linux fájlrendszer hibaelhárításának megértése és elsajátítása – 10. rész


A Linux Foundation elindította az LFCS tanúsítványt (Linux Foundation Certified Sysadmin), egy vadonatúj kezdeményezést, amelynek célja, hogy az egyének bárhol (és bárhol) megszerezhessék az alapszinttől a középszintig operatív támogatás Linux rendszerek számára, amely magában foglalja a futó rendszerek és szolgáltatások támogatását, valamint az általános felügyeletet és elemzést, valamint az intelligens döntéshozatalt, amikor a problémák felvetésére van szükség a felsőbb támogatói csoportok felé.

Tekintse meg a következő videót, amely bemutatja a Linux Foundation Certification Program bevezetését.

Ez az utolsó cikk (10. rész) a jelenlegi 10 oktatóanyagból álló sorozatból. Ebben a cikkben az alapvető shell-szkriptekre és a Linux fájlrendszerek hibaelhárítására fogunk összpontosítani. Mindkét témakör kötelező az LFCS minősítő vizsgához.

A terminálok és a héjak megértése

Először tisztázzunk néhány fogalmat.

  1. A shell egy olyan program, amely parancsokat vesz, és azokat az operációs rendszernek futtatja.
  2. A terminál egy olyan program, amely lehetővé teszi számunkra, mint végfelhasználók számára, hogy kölcsönhatásba lépjünk a héjjal. A terminálok egyik példája a GNOME terminál, amint az az alábbi képen látható.

Amikor először indítunk el egy shellt, megjelenik egy parancssor (más néven parancssor), amely közli velünk, hogy a shell készen áll a parancsok fogadására a szokásos beviteli eszközéről, amely általában a billentyűzet.

Érdemes lehet olvasni a sorozat egy másik cikkében (Parancs használata fájlok létrehozásához, szerkesztéséhez és manipulálásához – 1. rész), hogy áttekintsen néhány hasznos parancsot.

A Linux számos lehetőséget kínál a shellekhez, amelyek közül a következők a leggyakoribbak:

bash Shell

A Bash a Bourne Again SHell rövidítése, és a GNU Project alapértelmezett shellje. A Korn shell (ksh) és a C shell (csh) hasznos funkcióit tartalmazza, és egyszerre több fejlesztést is kínál. Ez az LFCS-tanúsítvánnyal érintett disztribúciók által használt alapértelmezett shell, és ebben az oktatóanyagban ezt a shellt fogjuk használni.

sh Shell

A Bourne SHell a legrégebbi shell, ezért sok UNIX-szerű operációs rendszer alapértelmezett shellje volt évek óta.

ksh Shell

A Korn SHell egy Unix shell, amelyet David Korn fejlesztett ki a Bell Labs-nál az 1980-as évek elején. Visszafelé kompatibilis a Bourne héjjal, és a C shell számos funkcióját tartalmazza.

A shell script nem több és nem kevesebb, mint egy végrehajtható programmá alakított szövegfájl, amely egyesíti a shell által egymás után végrehajtott parancsokat.

Alapvető Shell Scripting

Mint korábban említettük, a shell script egyszerű szövegfájlként születik. Így létrehozható és szerkeszthető kedvenc szövegszerkesztőnk segítségével. Érdemes lehet megfontolni a vi/m használatát (lásd: A vi Editor használata – a sorozat 2. része), amely szintaktikai kiemelést tartalmaz az Ön kényelme érdekében.

Írja be a következő parancsot egy myscript.sh nevű fájl létrehozásához, majd nyomja meg az Enter billentyűt.

vim myscript.sh

A shell szkript legelső sorának a következőnek kell lennie (más néven shebang).

#!/bin/bash

Megmondja ” az operációs rendszernek a tolmács nevét, amelyet a következő szöveg futtatásához kell használni.

Itt az ideje, hogy hozzáadjuk a parancsainkat. Megjegyzések hozzáadásával tisztázhatjuk az egyes parancsok vagy a teljes szkript célját. Vegye figyelembe, hogy a parancsértelmező figyelmen kívül hagyja a # font jellel kezdődő sorokat (magyarázó megjegyzések).

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

Miután a szkriptet megírtuk és elmentettük, végrehajthatóvá kell tennünk.

chmod 755 myscript.sh

Szkriptünk futtatása előtt szólnunk kell néhány szót a ` PATH környezeti változóról. Ha futunk,

echo $PATH

a parancssorból a ` PATH: tartalmát fogjuk látni: kettősponttal elválasztott listája azoknak a könyvtáraknak, amelyekben a rendszer keres, amikor beírjuk egy végrehajtható program nevét. Környezeti változónak nevezik, mert része a shell-környezetnek – egy olyan információhalmaznak, amely elérhetővé válik a shell és gyermekfolyamatai számára a shell első indításakor.

Amikor beírunk egy parancsot, és megnyomjuk az Enter billentyűt, a shell a ` PATH változóban felsorolt összes könyvtárban keres, és végrehajtja az első talált példányt. Lássunk egy példát,

Ha két azonos nevű végrehajtható fájl van, az egyik a /usr/local/bin, a másik pedig a /usr/bin mappában, akkor az első könyvtárban lévő fájl kerül végrehajtásra. először, míg a másikat figyelmen kívül hagyjuk.

Ha nem mentettük a szkriptünket a ` PATH változóban felsorolt könyvtárak egyikébe, akkor a végrehajtáshoz hozzá kell fűznünk a fájlnévhez a ./ karakterláncot. azt. Ellenkező esetben ugyanúgy futtathatjuk, mint egy normál paranccsal.

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

Feltételek

Ha egy parancsfájl sikeressége vagy sikertelensége miatt különböző műveleteket kell megadnia egy shell szkriptben, akkor az if konstrukciót használja az ilyen feltételek meghatározásához. Alapszintaxisa a következő:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Ahol a CONDITION a következők egyike lehet (itt csak a leggyakoribb feltételeket idézzük), és akkor igaz, ha:

  1. [ -egy fájl ] → fájl létezik.
  2. [ -d fájl ] → fájl létezik, és egy könyvtár.
  3. [ -f fájl ] →fájl létezik, és egy normál fájl.
  4. [ -u fájl ] →fájl létezik, és a SUID (felhasználói azonosító beállítása) bitje be van állítva.
  5. [ -g fájl ] →fájl létezik, és az SGID bitje be van állítva.
  6. [ -k fájl ] →fájl létezik, és a ragadós bitje be van állítva.
  7. [ -r fájl ] →fájl létezik és olvasható.
  8. [ -s fájl ]→ fájl létezik, és nem üres.
  9. [ -w fájl ]→fájl létezik és írható.
  10. A [ -x fájl ] igaz, ha a fájl létezik és végrehajtható.
  11. [ string1=karakterlánc2 ] → a karakterláncok egyenlőek.
  12. [ string1 != string2 ] →a karakterláncok nem egyenlőek.

Az [ int1 op int2 ] elemnek az előző listában kell lennie, míg az azt követő elemeknek (például a -eq –> igaz, ha az int1 > egyenlő az int2 értékkel.) egy „gyerekek” listának kell lennie a következőből: [ int1 op int2 ] ahol op az alábbi összehasonlító operátorok egyike.

  1. A -eq –> igaz, ha int1 egyenlő int2-vel.
  2. -ne –> igaz, ha az int1 nem egyenlő az int2-vel.
  3. -lt –> igaz, ha az int1 kisebb, mint az int2.
  4. -le –> igaz, ha az int1 kisebb vagy egyenlő, mint int2.
  5. -gt –> igaz, ha az int1 nagyobb, mint az int2.
  6. -ge –> igaz, ha az int1 nagyobb vagy egyenlő, mint int2.

For Loops

Ez a ciklus lehetővé teszi egy vagy több parancs végrehajtását egy értéklista minden értékéhez. Alapszintaxisa a következő:

for item in SEQUENCE; do 
		COMMANDS; 
done

Ahol az item egy általános változó, amely a SEQUENCE minden egyes értékét képviseli az egyes iterációk során.

Míg Loops

Ez a ciklus lehetővé teszi ismétlődő parancsok sorozatának végrehajtását mindaddig, amíg a vezérlőparancs nullával egyenlő kilépési állapottal fut (sikeresen). Alapszintaxisa a következő:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Ahol az EVALUATION_COMMAND bármely olyan parancs lehet, amely sikeres (0) vagy sikertelen (a 0-tól eltérő) állapottal léphet ki, és EXECUTE_COMMANDS lehet bármilyen program, szkript vagy shell konstrukció, beleértve az egyéb beágyazott ciklusokat is.

Mindent összerakva

A következő példával bemutatjuk az if konstrukció és a for ciklus használatát.

Annak meghatározása, hogy egy szolgáltatás fut-e rendszeralapú disztribúcióban

Hozzunk létre egy fájlt azon szolgáltatások listájával, amelyeket egy pillantással figyelni szeretnénk.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

A shell szkriptünknek így kell kinéznie.

#!/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

Magyarázzuk el, hogyan működik a szkript.

1). A for ciklus a myservices.txt fájlt a LIST egy elemével olvassa be. Ezt az egyetlen elemet a service nevű általános változó jelöli. A LISTA a következő kimenettel lesz feltöltve:

cat myservices.txt

2). A fenti parancs zárójelben van, és egy dollárjel előzi meg, jelezve, hogy ki kell értékelni a LIST feltöltéséhez, amelyen át fogunk ismételni.

3). A LIST minden eleméhez (a szolgáltatásváltozó minden példányához) a következő parancs kerül végrehajtásra.

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

Ezúttal meg kell előznünk az általános változónkat (amely a LIST minden elemét jelöli) egy dollárjellel, hogy jelezze, hogy ez egy változó, ezért minden iterációban ennek értékét kell használni. A kimenet ezután a grep-be kerül.

A –quiet jelző arra szolgál, hogy megakadályozza, hogy a grep megjelenítse a képernyőn azokat a sorokat, ahol a futó szó megjelenik. Amikor ez megtörténik, a fenti parancs 0 kilépési állapotot ad vissza (amelyet a $? jelképez az if-konstrukcióban), így ellenőrzi, hogy a szolgáltatás fut-e.

A 0-tól eltérő kilépési állapot (ami azt jelenti, hogy a futó szó nem található a systemctl status $service kimenetében) azt jelzi, hogy a szolgáltatás nem futás.

Egy lépéssel tovább léphetünk, és ellenőrizhetjük a myservices.txt fájl létezését, mielőtt még megpróbálnánk belépni a for ciklusba.

#!/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
Hálózati vagy internetes gazdagépek pingelése válaszstatisztika céljából

Érdemes lehet egy szövegfájlban karbantartani a gazdagépek listáját, és egy szkript segítségével időnként meghatározni, hogy pingelhetőek-e vagy sem (bátran cserélje ki a myhosts tartalmát, és próbálja ki magának ).

A beépített shell olvasási parancs utasítja a while ciklust, hogy soronként olvassa be a myhosts-t, és minden sor tartalmát hozzárendeli a host változóhoz, amelyet ezután a ping parancsnak ad át.

#!/bin/bash

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

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

Olvassa el még:

  1. Ismerje meg a Shell Scriptinget: Útmutató kezdőktől a rendszergazdákig
  2. 5 Shell Script a Shell programozás megtanulásához

Fájlrendszer hibaelhárítás

Bár a Linux egy nagyon stabil operációs rendszer, ha valamilyen okból (például áramszünet miatt) összeomlik, egy (vagy több) fájlrendszer nem lesz megfelelően lecsatolva, és ezért automatikusan ellenőrzi a hibákat, amikor a Linux újraindul.

Ezenkívül a rendszer minden alkalommal, amikor egy normál rendszerindítás során elindul, mindig ellenőrzi a fájlrendszerek integritását, mielőtt felcsatolná azokat. Ez mindkét esetben az fsck nevű eszközzel történik ("fájlrendszer ellenőrzése ").

Az fsck nemcsak a fájlrendszerek integritását ellenőrzi, hanem megkísérli kijavítani a sérült fájlrendszereket is, ha erre utasítást kap. A sérülés súlyosságától függően az fsck sikeres lehet vagy nem; amikor ez megtörténik, a fájlok helyreállított részei az elveszett+talált könyvtárba kerülnek, amely az egyes fájlrendszerek gyökerében található.

Végül, de nem utolsósorban meg kell jegyeznünk, hogy inkonzisztenciák akkor is előfordulhatnak, ha megpróbálunk eltávolítani egy USB-meghajtót, amikor az operációs rendszer még ír rá, és akár hardverkárosodást is okozhat.

Az fsck alapvető szintaxisa a következő:

fsck [options] filesystem
A fájlrendszer hibáinak ellenőrzése és automatikus javítási kísérlet

Ahhoz, hogy az fsck segítségével ellenőrizhessük a fájlrendszert, először le kell csatolnunk azt.

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

A -y jelző mellett használhatjuk a -a opciót a fájlrendszerek automatikus javítására, kérdések feltevése nélkül, és akkor is kikényszeríthetjük az ellenőrzést, ha a fájlrendszer tisztának tűnik.

fsck -af /dev/sdg1

Ha csak arra vagyunk kíváncsiak, hogy megtudjuk, mi a hiba (egyelőre anélkül, hogy megpróbálnánk bármit is javítani), akkor futtathatjuk az fsck-t a -n kapcsolóval, amely a fájlrendszer problémáit szabványos kimenetre írja ki.

fsck -n /dev/sdg1

Az fsck kimenetében megjelenő hibaüzenetektől függően tudni fogjuk, hogy megpróbálhatjuk-e magunk megoldani a problémát, vagy továbbíthatjuk azt a mérnöki csapatoknak, hogy további ellenőrzéseket végezzenek a hardveren.

Összegzés

Elérkeztünk ennek a 10 cikkből álló sorozatnak a végéhez, ahol megpróbáltuk lefedni az LFCS vizsga letételéhez szükséges alapvető tartományi kompetenciákat.

Nyilvánvaló okokból nem lehetséges egyetlen oktatóanyagban sem e témák minden aspektusát lefedni, és ezért reméljük, hogy ezek a cikkek jó úton haladnak, hogy új dolgokat próbáljatok ki, és folytassa a tanulást.

Ha bármilyen kérdése vagy észrevétele van, szívesen fogadjuk – ezért ne habozzon, írjon nekünk az alábbi űrlapon keresztül!