Razumijevanje i učenje osnovnog skriptiranja ljuske i rješavanja problema Linux datotečnog sustava - 10. dio


Zaklada Linux pokrenula je LFCS certifikaciju (Linux Foundation Certified Sysadmin), potpuno novu inicijativu čija je svrha omogućiti pojedincima svugdje (i bilo gdje) da dobiju certifikaciju u osnovnom do srednjem operativna podrška za Linux sustave, koja uključuje podršku pokrenutim sustavima i uslugama, zajedno s ukupnim nadzorom i analizom, plus pametno donošenje odluka kada je u pitanju iznošenje problema višim timovima za podršku.

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

Ovo je posljednji članak (10. dio) sadašnje duge serije od 10 uputa. U ovom ćemo se članku usredotočiti na osnovno skriptiranje ljuske i rješavanje problema Linux datotečnih sustava. Obje su teme potrebne za LFCS certifikacijski ispit.

Razumijevanje terminala i ljuski

Najprije razjasnimo nekoliko pojmova.

  1. Ljuska je program koji prima naredbe i daje ih operativnom sustavu na izvršenje.
  2. Terminal je program koji nama kao krajnjim korisnicima omogućuje interakciju s ljuskom. Jedan primjer terminala je GNOME terminal, kao što je prikazano na slici ispod.

Kada prvi put pokrenemo ljusku, ona prikazuje naredbeni redak (također poznat kao naredbeni redak), koji nam govori da je ljuska spremna za početak prihvaćanja naredbi sa svog standardnog ulaznog uređaja, što je obično tipkovnica.

Možda ćete htjeti pogledati još jedan članak u ovoj seriji (Koristite naredbu za stvaranje, uređivanje i upravljanje datotekama – 1. dio) da pregledate neke korisne naredbe.

Linux nudi niz opcija za ljuske, a sljedeće su najčešće:

bash Shell

Bash je kratica za Bourne Again SHell i zadana je ljuska GNU projekta. Uključuje korisne značajke Korn shell-a (ksh) i C shell-a (csh), nudeći nekoliko poboljšanja u isto vrijeme. Ovo je zadana ljuska koju koriste distribucije obuhvaćene LFCS certifikacijom i to je ljuska koju ćemo koristiti u ovom vodiču.

sh Školjka

Bourne SHell je najstarija ljuska i stoga je godinama bila zadana ljuska mnogih operativnih sustava sličnih UNIX-u.

ksh Školjka

Korn SHell je Unix ljuska koju je razvio David Korn u Bell Labsu ranih 1980-ih. Kompatibilan je unazad s Bourneovom ljuskom i uključuje mnoge značajke C ljuske.

Shell skripta nije ništa više ni manje nego tekstualna datoteka pretvorena u izvršni program koji kombinira naredbe koje ljuska izvršava jednu za drugom.

Osnovno skriptiranje ljuske

Kao što je ranije spomenuto, shell skripta se rađa kao obična tekstualna datoteka. Stoga se može stvarati i uređivati pomoću našeg omiljenog uređivača teksta. Možda ćete htjeti razmotriti korištenje vi/m (pogledajte Upotreba vi Editora – 2. dio ove serije), koji ima isticanje sintakse radi vaše udobnosti.

Upišite sljedeću naredbu za stvaranje datoteke pod nazivom myscript.sh i pritisnite Enter.

vim myscript.sh

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

#!/bin/bash

Operativnom sustavu “govori” naziv tumača koji bi se trebao koristiti za pokretanje teksta koji slijedi.

Sada je vrijeme da dodamo naše naredbe. Možemo razjasniti svrhu svake naredbe ili cijele skripte dodavanjem komentara. Imajte na umu da ljuska zanemaruje one retke koji počinju znakom funte # (objašnjavajući komentari).

#!/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 spremljena, moramo je učiniti izvršnom.

chmod 755 myscript.sh

Prije pokretanja naše skripte, moramo reći nekoliko riječi o varijabli okoline ` PATH. Ako trčimo,

echo $PATH

iz naredbenog retka, vidjet ćemo sadržaj ` PATH: popisa direktorija odvojenih dvotočkom koji se pretražuju kada unesemo naziv izvršnog programa. Naziva se varijablom okruženja jer je dio okruženja ljuske – skup informacija koje postaju dostupne ljusci i njenim podređenim procesima 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 instancu koju nađe. Pogledajmo primjer,

Ako postoje dvije izvršne datoteke s istim imenom, jedna u /usr/local/bin i druga u /usr/bin, ona u prvom direktoriju će se izvršiti prvi, dok će drugi biti zanemaren.

Ako nismo spremili našu skriptu u jedan od direktorija navedenih u varijabli ` PATH, moramo dodati ./ nazivu datoteke kako bismo izvršili to. U suprotnom, možemo ga pokrenuti baš kao što bismo učinili s običnom naredbom.

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

Kondicionali

Kad god trebate navesti različite smjerove radnji koje treba poduzeti u skripti ljuske, kao rezultat uspjeha ili neuspjeha naredbe, koristit ćete konstrukciju if za definiranje takvih uvjeta. Njegova osnovna sintaksa je:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

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

  1. [ -a datoteka ] → datoteka postoji.
  2. [ -d datoteka ] → datoteka postoji i direktorij je.
  3. [ -f datoteka ] →datoteka postoji i obična je datoteka.
  4. [ -u datoteka ] →datoteka postoji i njen bit SUID (set user ID) je postavljen.
  5. [ -g datoteka ] →datoteka postoji i njen SGID bit je postavljen.
  6. [ -k datoteka ] →datoteka postoji i njen ljepljivi bit je postavljen.
  7. [ -r datoteka ] →datoteka postoji i čitljiva je.
  8. [ -s datoteka ]→ datoteka postoji i nije prazna.
  9. [ -w datoteka ]→datoteka postoji iu nju se može pisati.
  10. [ -x datoteka ] je istina ako datoteka postoji i izvršna je.
  11. [ niz1=niz2 ] → nizovi su jednaki.
  12. [ string1 != string2 ] →stringovi nisu jednaki.

[ int1 op int2 ] treba biti dio prethodnog popisa, dok stavke koje slijede (na primjer, -eq –> vrijedi ako je int1 je jednako int2.) trebao bi biti popis “djece” od [ int1 op int2] gdje op je jedan od sljedećih operatora usporedbe.

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

Za petlje

Ova petlja omogućuje izvršavanje jedne ili više naredbi za svaku vrijednost na popisu vrijednosti. Njegova osnovna sintaksa je:

for item in SEQUENCE; do 
		COMMANDS; 
done

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

Dok petlje

Ova petlja omogućuje izvršavanje niza ponavljajućih naredbi sve dok se kontrolna naredba izvršava s 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 sa statusom uspjeha (0) ili neuspjeha (osim 0) i EXECUTE_COMMANDS može biti bilo koji program, skripta ili konstrukcija ljuske, uključujući druge ugniježđene petlje.

Sve zajedno

Sljedećim primjerom ćemo demonstrirati korištenje if konstrukcije i for petlje.

Utvrđivanje radi li usluga u distribuciji temeljenoj na systemd-u

Kreirajmo datoteku s popisom usluga koje želimo nadzirati na prvi pogled.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Naša skripta ljuske bi trebala izgledati ovako.

#!/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-a. Taj pojedinačni element označen je generičkom varijablom pod nazivom service. POPIS je popunjen izlazom,

cat myservices.txt

2). Gornja naredba je u zagradama i ispred nje znakom dolara kako bi se naznačilo da je treba procijeniti za popunjavanje POPISA koji ćemo ponavljati.

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

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

Ovaj put moramo ispred naše generičke varijable (koja predstavlja svaki element u LIST) staviti znak dolara kako bismo naznačili da je to varijabla i stoga treba koristiti njezinu vrijednost u svakoj iteraciji. Izlaz se zatim prenosi u grep.

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

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

Mogli bismo otići korak dalje i provjeriti postojanje myservices.txt prije nego što uopće 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
Pinganje niza mrežnih ili internetskih hostova za statistiku odgovora

Možda ćete htjeti održavati popis hostova u tekstualnoj datoteci i koristiti skriptu da s vremena na vrijeme utvrdite jesu li pingabilni ili ne (slobodno zamijenite sadržaj myhosts i pokušajte sami ).

Ugrađena naredba ljuske za čitanje govori petlji while da čita myhosts red po red i dodjeljuje sadržaj svakog retka varijabli host, koja 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 administratora sustava
  2. 5 Shell skripti za učenje programiranja ljuske

Rješavanje problema sa datotečnim sustavom

Iako je Linux vrlo stabilan operacijski sustav, ako se iz nekog razloga sruši (na primjer, zbog nestanka struje), jedan (ili više) vaših datotečnih sustava neće biti pravilno odmontiran i stoga će se automatski provjeriti ima li pogrešaka kada Linux se ponovno pokreće.

Osim toga, svaki put kada se sustav podigne tijekom normalnog pokretanja, uvijek provjerava integritet datotečnih sustava prije nego što ih montira. U oba slučaja to se izvodi pomoću alata pod nazivom fsck (“provjera datotečnog sustava”).

fsck ne samo da će provjeriti integritet datotečnih sustava, već će također pokušati popraviti oštećene datotečne sustave ako se to od vas zatraži. Ovisno o težini oštećenja, fsck može uspjeti ili ne; kada se to dogodi, vraćeni dijelovi datoteka se smještaju u direktorij lost+found koji se nalazi u korijenu svakog datotečnog sustava.

Na kraju, ali ne i najmanje važno, moramo napomenuti da se nedosljednosti mogu dogoditi i ako pokušamo ukloniti USB pogon dok operativni sustav još uvijek piše na njega, što može čak rezultirati oštećenjem hardvera.

Osnovna sintaksa fsck-a je sljedeća:

fsck [options] filesystem
Provjera grešaka u datotečnom sustavu i pokušaj automatskog popravka

Kako bismo provjerili datotečni sustav pomoću fsck-a, prvo ga moramo demontirati.

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

Osim zastavice -y, možemo koristiti opciju -a za automatski popravak datotečnog sustava bez postavljanja ikakvih pitanja i prisilnu provjeru čak i kada datotečni sustav izgleda čist.

fsck -af /dev/sdg1

Ako nas samo zanima saznati što nije u redu (bez pokušaja da išta popravimo za sada), možemo pokrenuti fsck s -n opcijom, koja će ispisati probleme sa datotečnim sustavom na standardni izlaz.

fsck -n /dev/sdg1

Ovisno o porukama o pogreškama u izlazu fsck-a, znat ćemo možemo li sami pokušati riješiti problem ili ga eskalirati inženjerskim timovima da izvrše daljnje provjere hardvera.

Sažetak

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

Iz očitih razloga, nije moguće pokriti svaki pojedini aspekt ovih tema u bilo kojem vodiču 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 nam se slobodno javite putem obrasca u nastavku!