Razumevanje in učenje osnovnih skriptov lupine in odpravljanje težav z datotečnim sistemom Linux - 10. del


Fundacija Linux je lansirala certifikat LFCS ( Linux Foundation Certified Sysadmin ), povsem novo pobudo, katere namen je posameznikom povsod (in kjer koli) omogočiti, da pridobijo osnovno in srednje znanje. operativna podpora sistemom Linux, ki vključuje podporo delujočim sistemom in storitvam, skupaj s splošnim nadzorom in analizami ter pametno odločanje, ko gre za odpiranje vprašanj zgornjim podpornim skupinam.

Oglejte si naslednji video, ki vas vodi k uvodu v certifikacijski program Linux Foundation.

To je zadnji članek (10. del) te dolge serije z 10 vajami. V tem članku se bomo osredotočili na osnovno skriptno lupino in odpravljanje težav z datotečnimi sistemi Linux. Obe temi sta obvezni za izpit LFCS.

Razumevanje terminalov in lupin

Najprej razjasnimo nekaj konceptov.

  1. Lupina je program, ki sprejme ukaze in jih preda operacijskemu sistemu, ki ga je treba izvršiti.
  2. Terminal je program, ki nam kot končnim uporabnikom omogoča interakcijo z lupino. Primer terminala je terminal GNOME, kot je prikazano na spodnji sliki.

Ko prvič zaženemo lupino, se prikaže ukazni poziv (znan tudi kot ukazna vrstica), ki nam pove, da je lupina pripravljena začeti sprejemati ukaze iz svoje standardne vhodne naprave, to je običajno tipkovnica.

Morda se boste želeli sklicevati na drug članek v tej seriji (Uporabite ukaz za ustvarjanje, urejanje in upravljanje datotek - 1. del), da pregledate nekatere uporabne ukaze.

Linux ponuja vrsto možnosti za lupine, med katerimi so najpogostejše:

Bash pomeni Bourne Again SHell in je privzeta lupina projekta GNU. Vključuje uporabne funkcije iz lupine Korn (ksh) in lupine C (csh), hkrati pa ponuja več izboljšav. To je privzeta lupina, ki jo uporabljajo distribucije, zajete v certificiranju LFCS, in lupino bomo uporabili v tej vadnici.

Bourneova školjka je najstarejša lupina in je zato že vrsto let privzeta lupina številnih operacijskih sistemov, podobnih Unixu.

Korn SHell je lupina Unixa, ki jo je v začetku osemdesetih razvil David Korn v laboratoriju Bell Labs. Z nazaj je združljiv z Bournovo lupino in vključuje številne lastnosti lupine C.

Skript lupine ni nič več in nič manj kot besedilna datoteka, pretvorjena v izvršljiv program, ki združuje ukaze, ki jih lupina izvrši eden za drugim.

Osnovno skriptno lupino

Kot smo že omenili, se skript lupine rodi kot navadna besedilna datoteka. Tako ga je mogoče ustvariti in urejati z našim najljubšim urejevalnikom besedil. Morda boste želeli razmisliti o uporabi vi/m (glejte Uporaba urejevalnika vi - 2. del te serije), ki za vaše udobje vključuje poudarjanje sintakse.

Vnesite naslednji ukaz, da ustvarite datoteko z imenom myscript.sh in pritisnite Enter.

# vim myscript.sh

Prva vrstica skripta lupine mora biti naslednja (znana tudi kot shebang ).

#!/bin/bash

Operacijskemu sistemu\" pove " ime tolmača, ki naj se uporablja za zagon besedila, ki sledi.

Zdaj je čas, da dodamo svoje ukaze. Z dodajanjem komentarjev lahko razjasnimo namen vsakega ukaza ali celotnega skripta. Upoštevajte, da lupina prezre tiste vrstice, ki se začnejo z znakom za funt # (pojasnjevalni komentarji).

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

Ko je skript napisan in shranjen, ga moramo narediti izvedljiv.

# chmod 755 myscript.sh

Pred zagonom skripta moramo povedati nekaj besed o spremenljivki okolja $PATH . Če tečemo,

echo $PATH

iz ukazne vrstice bomo videli vsebino $PATH: dvopičja ločenega seznama imenikov, ki se iščejo, ko vnesemo ime izvedljivega programa. Imenuje se spremenljivka okolja, ker je del okolja lupine - nabor informacij, ki je na voljo za lupino in njene podrejene procese ob prvem zagonu lupine.

Ko vtipkamo ukaz in pritisnemo Enter, lupina išče po vseh imenikih, ki so navedeni v spremenljivki $PATH , in izvede prvi najdeni primerek. Poglejmo primer,

Če sta dve izvršljivi datoteki z istim imenom, ena v /usr/local/bin in druga v /usr/bin , bo izvedena tista v prvem imeniku prvič, medtem ko drugega ne bomo upoštevali.

Če skripta nismo shranili v enega od imenikov, naštetih v spremenljivki $PATH , moramo imenu datoteke dodati ./ , da ga zaženemo. V nasprotnem primeru ga lahko zaženemo tako kot z običajnim ukazom.

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

Kadar morate v skriptu lupine določiti različne načine delovanja, ki so posledica uspeha ali neuspeha ukaza, boste za definiranje takšnih pogojev uporabili konstrukt if . Njegova osnovna sintaksa je:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Kjer je CONDITION lahko eno od naslednjega (tukaj so navedeni samo najpogostejši pogoji) in oceni kot resnično, kadar:

  1. [-datoteka] → datoteka obstaja.
  2. [-d datoteka] → datoteka obstaja in je imenik.
  3. [-f datoteka] → datoteka obstaja in je običajna datoteka.
  4. [-u datoteka] → datoteka obstaja in nastavljen je njen SUID (set user ID).
  5. [-g datoteka] → datoteka obstaja in nastavljen je njen bit SGID.
  6. [-k datoteka] → datoteka obstaja in nastavljen je njen lepljivi bit.
  7. [-r datoteka] → datoteka obstaja in je berljiva.
  8. [-s datoteka] → datoteka obstaja in ni prazna.
  9. [-w datoteka] → datoteka obstaja in jo je mogoče zapisovati.
  10. [-x datoteka] je res, če datoteka obstaja in je izvedljiva.
  11. [string1 = string2] → nizi so enaki.
  12. [string1! = string2] → nizi niso enaki.

[int1 op int2] mora biti del predhodnega seznama, medtem ko elementi, ki sledijo (na primer -eq -> , veljajo, če int1 je enako int2 .) mora biti seznam » otrok « v [ int1 op int2 ], kjer je op je eden izmed naslednjih operaterjev primerjave.

  1. -eq -> je res, če je int1 enak int2.
  2. -ne -> true, če int1 ni enak int2.
  3. -lt -> true, če je int1 manjši od int2.
  4. -le -> true, če je int1 manjši ali enak int2.
  5. -gt -> true, če je int1 večji od int2.
  6. -ge -> true, če je int1 večji ali enak int2.

Ta zanka omogoča izvajanje enega ali več ukazov za vsako vrednost na seznamu vrednosti. Njegova osnovna sintaksa je:

for item in SEQUENCE; do 
		COMMANDS; 
done

Kjer je element generična spremenljivka, ki predstavlja vsako vrednost v SEQUENCE med vsako ponovitvijo.

Ta zanka omogoča izvajanje vrste ponavljajočih se ukazov, dokler se nadzorni ukaz izvaja s statusom izhoda, enakim nič (uspešno). Njegova osnovna sintaksa je:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Kjer so EVALUATION_COMMAND lahko kateri koli ukazi, ki lahko izstopijo s statusom uspeha ( 0 ) ali neuspeha (razen 0) in EXECUTE_COMMANDS lahko kateri koli program, skript ali lupinski konstrukt, vključno z drugimi ugnezdenimi zankami.

Uporabo konstrukta if in for zanke bomo prikazali z naslednjim primerom.

Ustvarimo datoteko s seznamom storitev, ki jih želimo hitro spremljati.

# cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Naš skript lupine bi moral izgledati tako.

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

1). Zanka for bere datoteko myservices.txt po en element LIST naenkrat. Ta posamezen element je označen z generično spremenljivko z imenom storitev. SEZNAM je zapolnjen z izhodnimi podatki,

# cat myservices.txt

2). Zgornji ukaz je zaprt v oklepajih, pred njim pa je znak za dolar, ki označuje, da ga je treba ovrednotiti, da zapolni SEZNAM, ki ga bomo ponovili.

3). Za vsak element LIST (kar pomeni vsak primerek spremenljivke storitve) se izvede naslednji ukaz.

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

Tokrat moramo pred našo generično spremenljivko (ki predstavlja vsak element na SEZNAM ) predvajati znak za dolar, ki označuje, da gre za spremenljivko, zato je treba uporabiti njeno vrednost v vsaki ponovitvi. Izhod se nato napelje v grep.

Oznaka –tiho se uporablja za preprečevanje, da bi grep na zaslonu prikazoval vrstice, kjer se prikaže beseda, ki se izvaja. Ko se to zgodi, zgornji ukaz vrne stanje izhoda 0 (predstavlja ga $? v konstrukciji if) in s tem preveri, ali se storitev izvaja.

Izhodno stanje, ki se razlikuje od 0 (kar pomeni, da v izhodu systemctl status $service ni bilo mogoče najti zagnane besede ), pomeni, da storitev ni teče.

Lahko gremo še korak naprej in preverimo, ali obstaja myservices.txt , še preden poskusimo vstopiti v zanko 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

Morda boste želeli ohraniti seznam gostiteljev v besedilni datoteki in s pomočjo skripta vsake toliko časa ugotoviti, ali jih je mogoče predvajati ali ne (lahko zamenjate vsebino myhosts in preizkusite sami ).

Vgrajeni ukaz bralne lupine pove zanki while, naj prebere myhosts vrstico za vrstico in vsebino vsake vrstice dodeli spremenljivemu gostitelju, ki se nato posreduje ukazu 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

Preberite tudi :

  1. Learn Shell Scripting: Guide to Newbies to System Administrator
  2. 5 skriptov lupine za učenje programiranja lupine

Odpravljanje težav z datotečnim sistemom

Čeprav je Linux zelo stabilen operacijski sistem, če se iz kakršnega koli razloga zruši (na primer zaradi izpada električne energije), eden (ali več) vaših datotečnih sistemov ne bo pravilno demontiran in bo samodejno preverjen glede napak, ko bo Linux se znova zažene.

Poleg tega vsakič, ko se sistem zažene med običajnim zagonom, pred namestitvijo vedno preveri celovitost datotečnih sistemov. V obeh primerih se to izvede z orodjem z imenom fsck (\ " preverjanje datotečnega sistema ").

fsck ne bo preveril samo celovitosti datotečnih sistemov, ampak bo poizkusil tudi popraviti poškodovane datotečne sisteme, če bo to naročeno. Odvisno od resnosti škode lahko fsck uspe ali ne; ko se to zgodi, se obnovljeni deli datotek shranijo v imenik izgubljeno + najdeno , ki se nahaja v korenu vsakega datotečnega sistema.

Nenazadnje moramo opozoriti, da se lahko pojavijo tudi nedoslednosti, če poskušamo odstraniti pogon USB, ko operacijski sistem še vedno piše nanj, in lahko celo povzroči poškodbe strojne opreme.

Osnovna sintaksa fsck je naslednja:

# fsck [options] filesystem

Če želite preveriti datotečni sistem s fsck, ga moramo najprej demontirati.

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

Poleg oznake -y lahko z možnostjo -a samodejno popravimo datotečni sistem, ne da bi postavljali kakršna koli vprašanja, in prisilno preverimo, tudi če je datotečni sistem videti čist.

# fsck -af /dev/sdg1

Če nas zanima samo ugotovitev, kaj je narobe (ne da bi zaenkrat poskušali kaj popraviti), lahko zaženemo fsck z možnostjo -n , ki bo izdala težave z datotečnim sistemom v standardni izhod.

# fsck -n /dev/sdg1

Glede na sporočila o napakah v izhodu fsck bomo vedeli, ali lahko težavo poskušamo rešiti sami ali jo posredovati inženirskim skupinam za nadaljnje preverjanje strojne opreme.

Povzetek

Prispeli smo na konec te serije s 10 članki , kjer smo poskušali zajeti osnovne kompetence domene, potrebne za opravljanje izpita LFCS .

Iz očitnih razlogov v nobeni vaji ni mogoče zajeti vseh vidikov teh tem in zato upamo, da ste s temi članki prišli na pravo pot, da sami preizkusite nove stvari in nadaljujete z učenjem.

Če imate kakršna koli vprašanja ali komentarje, so vedno dobrodošli - zato nam ne odlašajte in nam pošljite vrstico prek spodnjega obrazca!