Razumijevanje i učenje osnovnog shell skriptiranja i rješavanja problema s Linux sistemom datoteka - 10. dio


Linux fondacija pokrenula je LFCS certifikaciju (Linux Foundation Certified Sysadmin), potpuno novu inicijativu čija je svrha omogućiti pojedincima svuda (i bilo gdje) da dobiju certifikaciju od osnovnog do srednjeg operativnu podršku za Linux sisteme, koja uključuje podršku pokrenutim sistemima i uslugama, zajedno sa cjelokupnim nadzorom i analizom, plus pametno donošenje odluka kada je u pitanju podizanje problema višim timovima za podršku.

Pogledajte sljedeći video koji vas vodi kroz uvod u program sertifikacije Linux Foundation.

Ovo je posljednji članak (10. dio) ove serije od 10 tutorijala. U ovom članku ćemo se fokusirati na osnovne shell skripte i rješavanje problema s Linux sistemima datoteka. Obje teme su potrebne za LFCS sertifikacijski ispit.

Razumijevanje terminala i školjki

Razjasnimo prvo nekoliko koncepata.

  1. Shell je program koji preuzima komande i daje ih operativnom sistemu da se izvrši.
  2. Terminal je program koji nam kao krajnjim korisnicima omogućava interakciju sa ljuskom. Jedan primjer terminala je GNOME terminal, kao što je prikazano na donjoj slici.

Kada prvi put pokrenemo ljusku, ona predstavlja komandnu liniju (poznatu i kao komandna linija), koja nam govori da je ljuska spremna da počne da prihvata komande sa svog standardnog uređaja za unos, koji je obično tastatura.

Možda ćete htjeti pogledati još jedan članak u ovoj seriji (Koristite naredbu za kreiranje, uređivanje i manipulaciju datotekama – 1. dio) kako biste pregledali neke korisne komande.

Linux pruža niz opcija za ljuske, od kojih su sljedeće najčešće:

bash Shell

Bash je skraćenica za Bourne Again Shell i podrazumevana je školjka GNU projekta. Uključuje korisne karakteristike iz Korn shell (ksh) i C shell (csh), nudeći nekoliko poboljšanja u isto vrijeme. Ovo je zadana ljuska koju koriste distribucije pokrivene LFCS certifikatom, i to je ljuska koju ćemo koristiti u ovom vodiču.

sh Shell

Bourne Shell je najstarija ljuska i stoga je bila zadana ljuska mnogih operativnih sistema sličnih UNIX-u dugi niz godina.

ksh Shell

Korn Shell je Unix ljuska koju je razvio David Korn u Bell Labsu ranih 1980-ih. Kompatibilan je unatrag s Bourne školjkom i uključuje mnoge karakteristike C ljuske.

Skripta ljuske nije ništa više i ništa manje od tekstualne datoteke pretvorene u izvršni program koji kombinuje komande koje ljuska izvršava jednu za drugom.

Basic Shell Scripting

Kao što je ranije spomenuto, shell skripta se rađa kao običan tekstualni fajl. Dakle, može se kreirati i uređivati pomoću našeg preferiranog uređivača teksta. Možda ćete želeti da razmislite o korišćenju vi/m (pogledajte Korišćenje vi Editor-a – 2. deo ove serije), koji sadrži isticanje sintakse radi vaše udobnosti.

Unesite sljedeću naredbu da kreirate datoteku pod nazivom myscript.sh i pritisnite Enter.

vim myscript.sh

Prvi red shell skripte mora biti sljedeći (također poznat kao shebang).

#!/bin/bash

On “kaže” operativnom sistemu ime interpretatora koji treba da se koristi za pokretanje teksta koji sledi.

Sada je vrijeme da dodamo naše komande. Možemo razjasniti svrhu svake naredbe, ili cijele skripte, dodavanjem komentara. Imajte na umu da ljuska ignoriše te redove koji počinju sa znakom funte # (komentari sa objašnjenjima).

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

Nakon što je skripta napisana i sačuvana, moramo je učiniti izvršnom.

chmod 755 myscript.sh

Prije pokretanja naše skripte, moramo reći nekoliko riječi o varijabli okruženja ` PATH. ako trčimo,

echo $PATH

iz komandne linije, vidjet ćemo sadržaj ` PATH: liste direktorija razdvojenih dvotočkama koji se pretražuju kada unesemo ime izvršnog programa. Zove se varijabla okruženja jer je dio okruženja ljuske – skup informacija koji postaju dostupni za ljusku i njene podređene procese kada se ljuska prvi put pokrene.

Kada upišemo naredbu i pritisnemo Enter, ljuska pretražuje sve direktorije navedene u varijabli ` PATH i izvršava prvu pronađenu instancu. Pogledajmo primjer,

Ako postoje dvije izvršne datoteke s istim imenom, jedna u /usr/local/bin i druga u /usr/bin, izvršit će se ona u prvom direktoriju prvo, dok će drugo biti zanemareno.

Ako nismo sačuvali našu skriptu unutar jednog od direktorija navedenih u varijabli ` PATH, moramo dodati ./ imenu datoteke da bismo izvršili to. U suprotnom, možemo ga pokrenuti baš kao što bismo uradili sa regularnom komandom.

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

Uslovi

Kad god treba da navedete različite pravce radnji koje treba preduzeti u shell skripti, kao rezultat uspeha ili neuspeha komande, koristićete if konstrukciju da definišete takve uslove. Njegova osnovna sintaksa je:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Gdje CONDITION može biti jedno od sljedećeg (ovdje su citirani samo najčešći uvjeti) i procjenjuje se na istinito kada:

  1. [ -a fajl ] → fajl postoji.
  2. [ -d datoteka ] → datoteka postoji i predstavlja direktorij.
  3. [ -f fajl ] →fajl postoji i običan je fajl.
  4. [ -u fajl ] →datoteka postoji i njen SUID (podešavanje korisničkog ID-a) bit je postavljen.
  5. [ -g fajl ] →datoteka postoji i njen SGID bit je postavljen.
  6. [ -k datoteka ] →datoteka postoji i njen ljepljivi bit je postavljen.
  7. [ -r fajl ] →fajl postoji i čitljiv je.
  8. [ -s fajl ]→ fajl postoji i nije prazan.
  9. [ -w fajl ]→fajl postoji i može se pisati.
  10. [ -x datoteka ] je istina ako datoteka postoji i može se izvršiti.
  11. [ string1=string2 ] → nizovi su jednaki.
  12. [ string1 != string2 ] →stringovi nisu jednaki.

[ int1 op int2 ] bi trebao biti dio prethodne liste, dok stavke koje slijede (na primjer, -eq –> je istina ako int1 je jednako int2.) bi trebala biti “djeca” lista [ int1 op int2 ] gdje je op je jedan od sljedećih operatora poređenja.

  1. -eq –> je istinit ako je int1 jednako int2.
  2. -ne –> istina ako int1 nije jednako int2.
  3. -lt –> istina ako je int1 manji od int2.
  4. -le –> istina ako je int1 manji ili jednak int2.
  5. -gt –> istina ako je int1 veći od int2.
  6. -ge –> istina ako je int1 veći ili jednak int2.

For Loops

Ova petlja omogućava da se izvrši jedna ili više naredbi za svaku vrijednost na listi vrijednosti. Njegova osnovna sintaksa je:

for item in SEQUENCE; do 
		COMMANDS; 
done

Gdje je item generička varijabla koja predstavlja svaku vrijednost u SEQUENCE tokom svake iteracije.

While Loops

Ova petlja omogućava izvršavanje niza naredbi koje se ponavljaju sve dok se kontrolna komanda izvršava sa izlaznim statusom jednakim nuli (uspješno). Njegova osnovna sintaksa je:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Gdje EVALUATION_COMMAND može biti bilo koja naredba(e) koja može izaći s uspjehom (0) ili neuspjelim (osim 0) statusom, i EXECUTE_COMMANDS može biti bilo koji program, skripta ili shell konstrukcija, uključujući druge ugniježđene petlje.

Stavljajući sve zajedno

Demonstrirat ćemo upotrebu if konstrukcije i for petlje na sljedećem primjeru.

Određivanje da li se usluga izvodi u distro baziranoj na systemd-u

Kreirajmo fajl sa listom usluga koje želimo da pratimo na prvi pogled.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Naša shell skripta bi trebala izgledati.

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

Objasnimo kako skripta funkcionira.

1). Petlja for čita datoteku myservices.txt jedan po jedan element LIST. Taj pojedinačni element je označen generičkom varijablom pod nazivom service. LISTA je popunjena sa izlazom,

cat myservices.txt

2). Gornja komanda je zatvorena u zagradama i prethodi joj znak dolara kako bi se naznačilo da treba procijeniti da bi se popunila LISTA koju ćemo ponavljati.

3). Za svaki element LIST (što znači svaku instancu servisne varijable), sljedeća komanda će se izvršiti.

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

Ovog puta moramo prethoditi našoj generičkoj varijabli (koja predstavlja svaki element u LIST) sa znakom dolara kako bismo naznačili da je varijabla i stoga treba koristiti njenu vrijednost u svakoj iteraciji. Izlaz se zatim prenosi u grep.

Oznaka –quiet se koristi da spriječi grep da prikaže na ekranu redove u kojima se pojavljuje riječ run. Kada se to dogodi, gornja komanda vraća izlazni status 0 (predstavljen sa $? u if konstrukciji), čime se potvrđuje da je usluga pokrenuta.

Status izlaza različit od 0 (što znači da riječ pokrenuta nije pronađena u izlazu systemctl status $service) ukazuje da usluga nije trčanje.

Mogli bismo otići korak dalje i provjeriti postojanje myservices.txt prije nego što pokušamo ući u for petlju.

#!/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
Pingovanje niza mrežnih ili internetskih hostova za statistiku odgovora

Možda ćete htjeti održavati listu hostova u tekstualnoj datoteci i koristiti skriptu da s vremena na vrijeme odredite da li se mogu pingati ili ne (slobodno zamijenite sadržaj myhosts i pokušajte sami ).

Ugrađena naredba ljuske read govori while petlji da čita myhosts red po red i dodjeljuje sadržaj svake linije promjenljivom hostu, koji se zatim prosljeđuje naredbi 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

Pročitajte također:

  1. Naučite shell skriptiranje: Vodič od početnika do sistemskog administratora
  2. 5 Shell skripti za učenje shell programiranja

Rešavanje problema sa sistemom datoteka

Iako je Linux vrlo stabilan operativni sistem, ako se ruši iz nekog razloga (na primjer, zbog nestanka struje), jedan (ili više) vaših datotečnih sistema neće biti ispravno isključen i stoga će se automatski provjeriti ima li grešaka kada Linux se ponovo pokreće.

Osim toga, svaki put kada se sistem pokrene tokom normalnog pokretanja, uvijek provjerava integritet datotečnih sistema prije nego što ih montira. U oba slučaja ovo se izvodi pomoću alata pod nazivom fsck (“provjera sistema datoteka ”).

fsck ne samo da će provjeriti integritet datotečnih sistema, već će i pokušati popraviti oštećene sisteme datoteka ako to dobije instrukcije. Ovisno o ozbiljnosti oštećenja, fsck može uspjeti ili ne; kada se to dogodi, oporavljeni dijelovi datoteka se stavljaju u direktorij izgubljeno+pronađeno, koji se nalazi u korijenu svakog sistema datoteka.

Na kraju, ali ne i najmanje važno, moramo napomenuti da se nedosljednosti mogu dogoditi i ako pokušamo da uklonimo USB disk dok operativni sistem još uvijek upisuje na njega, a može čak dovesti do oštećenja hardvera.

Osnovna sintaksa fsck-a je sljedeća:

fsck [options] filesystem
Provjeravanje sistema datoteka za greške i pokušaj automatskog popravka

Da bismo provjerili sistem datoteka pomoću fsck-a, prvo ga moramo demontirati.

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

Osim oznake -y, možemo koristiti opciju -a da automatski popravimo sistem datoteka bez postavljanja pitanja i prisilno provjeravamo čak i kada sistem datoteka izgleda čisto.

fsck -af /dev/sdg1

Ako smo samo zainteresovani da saznamo šta nije u redu (bez pokušaja da popravimo bilo šta za sada), možemo pokrenuti fsck sa -n opcijom, koja će probleme sa datotečnim sistemom izbaciti na standardni izlaz.

fsck -n /dev/sdg1

Ovisno o porukama o grešci u izlazu fsck-a, znat ćemo da li možemo pokušati sami riješiti problem ili ga proslijediti timovima inženjera kako bi izvršili daljnje provjere hardvera.

Sažetak

Stigli smo do kraja ove serije 10 članaka gdje smo pokušali pokriti osnovne kompetencije u domenu potrebne za polaganje LFCS ispita.

Iz očiglednih razloga, nije moguće pokriti svaki aspekt ovih tema ni u jednom tutorijalu, i zato se nadamo da su vas ovi članci doveli na pravi put da sami isprobate nove stvari i nastavite učiti.

Ako imate bilo kakvih pitanja ili komentara, uvijek su dobrodošli - stoga ne oklijevajte da nam se javite putem obrasca ispod!