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.
- A shell egy olyan program, amely parancsokat vesz, és azokat az operációs rendszernek futtatja.
- 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:
- [ -egy fájl ] → fájl létezik.
- [ -d fájl ] → fájl létezik, és egy könyvtár.
- [ -f fájl ] →fájl létezik, és egy normál fájl.
- [ -u fájl ] →fájl létezik, és a SUID (felhasználói azonosító beállítása) bitje be van állítva.
- [ -g fájl ] →fájl létezik, és az SGID bitje be van állítva.
- [ -k fájl ] →fájl létezik, és a ragadós bitje be van állítva.
- [ -r fájl ] →fájl létezik és olvasható.
- [ -s fájl ]→ fájl létezik, és nem üres.
- [ -w fájl ]→fájl létezik és írható.
- A [ -x fájl ] igaz, ha a fájl létezik és végrehajtható.
- [ string1=karakterlánc2 ] → a karakterláncok egyenlőek.
- [ 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.
- A -eq –> igaz, ha int1 egyenlő int2-vel.
- -ne –> igaz, ha az int1 nem egyenlő az int2-vel.
- -lt –> igaz, ha az int1 kisebb, mint az int2.
- -le –> igaz, ha az int1 kisebb vagy egyenlő, mint int2.
- -gt –> igaz, ha az int1 nagyobb, mint az int2.
- -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:
- Ismerje meg a Shell Scriptinget: Útmutató kezdőktől a rendszergazdákig
- 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!