Forståelse og læring Grundlæggende shell scripting og Linux filsystem fejlfinding - del 10


Linux Foundation lancerede LFCS certificering ( Linux Foundation Certified Sysadmin ), et helt nyt initiativ, hvis formål er at give enkeltpersoner overalt (og hvor som helst) mulighed for at blive certificeret i grundlæggende til mellemliggende operativ support til Linux-systemer, som inkluderer understøttelse af kørende systemer og tjenester sammen med overordnet overvågning og analyse plus smart beslutningstagning, når det kommer til at rejse problemer til øvre supportteams.

Tjek følgende video, der guider dig til en introduktion til Linux Foundation-certificeringsprogrammet.

Dette er den sidste artikel (del 10) i den nuværende lange serie med 10 tutorials. I denne artikel vil vi fokusere på grundlæggende shell-scripting og fejlfinding af Linux-filsystemer. Begge emner kræves til LFCS-certificeringseksamen.

Forståelse af terminaler og skaller

Lad os afklare et par begreber først.

  1. En shell er et program, der tager kommandoer og giver dem til det operativsystem, der skal udføres.
  2. En terminal er et program, der giver os som slutbrugere mulighed for at interagere med skallen. Et eksempel på en terminal er GNOME-terminal, som vist i nedenstående billede.

Når vi først starter en shell, præsenterer den en kommandoprompt (også kendt som kommandolinjen), som fortæller os, at skallen er klar til at begynde at acceptere kommandoer fra sin standardinputenhed, som normalt er tastaturet.

Det kan være en god idé at henvise til en anden artikel i denne serie (Brug kommando til at oprette, redigere og manipulere filer - del 1) for at gennemgå nogle nyttige kommandoer.

Linux giver en række muligheder for skaller, hvor følgende er den mest almindelige:

Bash står for Bourne Again SHell og er GNU-projekts standardskal. Det indeholder nyttige funktioner fra Korn shell (ksh) og C shell (csh), der tilbyder flere forbedringer på samme tid. Dette er standardskallen, der bruges af distributionerne, der er dækket af LFCS-certificeringen, og det er den skal, vi vil bruge i denne vejledning.

Bourne SHell er den ældste skal og har derfor været standardskallen i mange UNIX-lignende operativsystemer i mange år.

Korn SHell er en Unix-skal, som blev udviklet af David Korn hos Bell Labs i begyndelsen af 1980'erne. Det er bagudkompatibelt med Bourne-skallen og indeholder mange funktioner i C-skallen.

Et shell-script er intet mere og intet mindre end en tekstfil, der er omdannet til et eksekverbart program, der kombinerer kommandoer, der udføres af skallen efter hinanden.

Grundlæggende Shell Scripting

Som nævnt tidligere er et shell-script født som en almindelig tekstfil. Således kan oprettes og redigeres ved hjælp af vores foretrukne teksteditor. Det kan være en god idé at overveje at bruge vi/m (se Brug af vi Editor - Del 2 i denne serie), som indeholder syntaksfremhævning for din bekvemmelighed.

Skriv følgende kommando for at oprette en fil med navnet myscript.sh og tryk på Enter.

# vim myscript.sh

Den allerførste linje i et shell-script skal være som følger (også kendt som en shebang ).

#!/bin/bash

Det " fortæller " operativsystemet navnet på den tolk, der skal bruges til at køre den følgende tekst.

Nu er det tid til at tilføje vores kommandoer. Vi kan afklare formålet med hver kommando eller hele scriptet ved også at tilføje kommentarer. Bemærk, at skallen ignorerer disse linjer, der begynder med et pundtegn # (forklarende kommentarer).

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

Når scriptet er blevet skrevet og gemt, skal vi gøre det eksekverbart.

# chmod 755 myscript.sh

Før vi kører vores script, skal vi sige et par ord om miljøvariablen $ PATH . Hvis vi løber,

echo $PATH

fra kommandolinjen ser vi indholdet af $ PATH: en kolon-adskilt liste over mapper, der søges, når vi indtaster navnet på et eksekverbart program. Det kaldes en miljøvariabel, fordi det er en del af skalmiljøet - et sæt information, der bliver tilgængeligt for skallen og dens underordnede processer, når skallen først startes.

Når vi skriver en kommando og trykker på Enter, søger skallen i alle mapper, der er anført i variablen $ PATH og udfører den første forekomst, der findes. Lad os se et eksempel,

Hvis der er to eksekverbare filer med samme navn, en i /usr/local/bin og en anden i /usr/bin , udføres den i den første mappe først, hvorimod den anden vil blive ignoreret.

Hvis vi ikke har gemt vores script i et af de mapper, der er anført i variablen $ PATH , skal vi tilføje ./ til filnavnet for at udføre det. Ellers kan vi køre det, som vi ville gøre med en almindelig kommando.

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

Når du har brug for at angive forskellige handlingsforløb, der skal udføres i et shell-script som følge af succes eller fiasko for en kommando, bruger du if -konstruktionen til at definere sådanne betingelser. Dens grundlæggende syntaks er:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Hvor BETINGELSE kan være et af følgende (kun de hyppigste betingelser nævnes her) og vurderes til sandt, når:

  1. [-en fil] → filen findes.
  2. [-d fil] → filen findes og er en mappe.
  3. [-f fil] → filen findes og er en almindelig fil.
  4. [-u fil] → filen findes, og dens SUID (sæt bruger-id) bit er indstillet.
  5. [-g fil] → filen findes, og dens SGID-bit er indstillet.
  6. [-k fil] → filen findes, og dens klæbende bit er indstillet.
  7. [-r fil] → filen findes og kan læses.
  8. [-s fil] → filen findes og er ikke tom.
  9. [-w fil] → filen findes og kan skrives.
  10. [-x fil] er sandt, hvis filen findes og er eksekverbar.
  11. [string1 = string2] → strengene er ens.
  12. [string1! = string2] → strengene er ikke ens.

[int1 op int2] skal være en del af den foregående liste, mens de følgende punkter (f.eks. -eq -> er sandt, hvis int1 er lig med int2 .) skal være en " børn " -liste med [ int1 op int2 ] hvor op er en af følgende sammenligningsoperatører.

  1. -eq -> er sandt, hvis int1 er lig med int2.
  2. -ne -> sandt, hvis int1 ikke er lig med int2.
  3. -lt -> sandt, hvis int1 er mindre end int2.
  4. -le -> sandt, hvis int1 er mindre end eller lig med int2.
  5. -gt -> sandt, hvis int1 er større end int2.
  6. -ge -> sandt, hvis int1 er større end eller lig med int2.

Denne sløjfe gør det muligt at udføre en eller flere kommandoer for hver værdi i en liste over værdier. Dens grundlæggende syntaks er:

for item in SEQUENCE; do 
		COMMANDS; 
done

Hvor element er en generisk variabel, der repræsenterer hver værdi i SEKVENS under hver iteration.

Denne sløjfe gør det muligt at udføre en række gentagne kommandoer, så længe kontrolkommandoen udføres med en exitstatus lig med nul (med succes). Dens grundlæggende syntaks er:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Hvor EVALUATION_COMMAND kan være en hvilken som helst kommando (er), der kan afslutte med en succes ( 0 ) eller fiasko (undtagen 0) status, og EXECUTE_COMMANDS kan være ethvert program, script eller skalkonstruktion, herunder andre indlejrede sløjfer.

Vi demonstrerer brugen af if-konstruktionen og for-loop med følgende eksempel.

Lad os oprette en fil med en liste over tjenester, som vi hurtigt vil overvåge.

# cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Vores shell-script skal se ud.

#!/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). For-sløjfen læser myservices.txt filen et element af LIST ad gangen. Dette enkelt element er betegnet med den generiske variabel med navnet service. LISTEN er befolket med output fra,

# cat myservices.txt

2). Ovenstående kommando er omgivet af parenteser og indledes med et dollartegn for at indikere, at det skal evalueres for at udfylde den LISTE, som vi vil gentage.

3). For hvert element i LIST (hvilket betyder enhver forekomst af tjenestevariablen) udføres følgende kommando.

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

Denne gang er vi nødt til at gå foran vores generiske variabel (som repræsenterer hvert element i LISTE ) med et dollartegn for at indikere, at det er en variabel, og dermed skal dens værdi i hver iteration bruges. Outputtet ledes derefter til grep.

Flagget –stille bruges til at forhindre grep i at vise linjerne, hvor ordet kører vises på skærmen. Når dette sker, returnerer ovenstående kommando en exitstatus på 0 (repræsenteret af $? i if-konstruktionen) og bekræfter således, at tjenesten kører.

En anden udgangsstatus end 0 (hvilket betyder at ordet kører ikke blev fundet i output fra systemctl status $ service ) indikerer at tjenesten ikke er kører.

Vi kunne gå et skridt videre og kontrollere, om der findes myservices.txt , før vi endda forsøger at gå ind i for-sløjfen.

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

Det kan være en god idé at opretholde en liste over værter i en tekstfil og bruge et script til at bestemme, om de kan pinges eller ikke (erstatt indholdet af myhosts og prøv selv ).

Den indbyggede kommando for læse-shell fortæller mens-sløjfen skal læse myhosts linje for linje og tildeler indholdet af hver linje til den variable vært, som derefter sendes til ping -kommandoen.

#!/bin/bash

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

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

Læs også :

  1. Lær Shell Scripting: En guide fra nybegyndere til systemadministrator
  2. 5 shell-scripts til læring af shell-programmering

Fejlfinding af filsystem

Selvom Linux er et meget stabilt operativsystem, hvis det af en eller anden grund går ned (f.eks. På grund af strømafbrydelse), afmonteres et (eller flere) af dine filsystemer ikke korrekt og vil derfor automatisk blive kontrolleret for fejl, når Linux genstartes.

Derudover kontrollerer det altid systemets integritet, hver gang systemet starter under en normal opstart, før det monteres. I begge tilfælde udføres dette ved hjælp af et værktøj ved navn fsck (" filsystemkontrol ").

fsck vil ikke kun kontrollere filsystemers integritet, men også forsøge at reparere korrupte filsystemer, hvis de bliver bedt om det. Afhængig af sværhedsgraden af skade kan fsck lykkes eller ej; når det sker, placeres gendannede dele af filer i biblioteket mistet + fundet placeret i roden til hvert filsystem.

Sidst men ikke mindst skal vi bemærke, at inkonsekvenser også kan ske, hvis vi forsøger at fjerne et USB-drev, når operativsystemet stadig skriver til det og endda kan resultere i hardwareskader.

Den basale syntaks for fsck er som følger:

# fsck [options] filesystem

For at kontrollere et filsystem med fsck skal vi først afmontere det.

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

Udover flagget -y kan vi bruge indstillingen -a til automatisk at reparere filsystemerne uden at stille spørgsmål og tvinge kontrollen, selv når filsystemet ser rent ud.

# fsck -af /dev/sdg1

Hvis vi kun er interesserede i at finde ud af, hvad der er galt (uden at forsøge at rette noget på nuværende tidspunkt), kan vi køre fsck med indstillingen -n , som vil outputte filsystemproblemerne til standardoutput.

# fsck -n /dev/sdg1

Afhængigt af fejlmeddelelserne i output fra fsck, ved vi, om vi selv kan prøve at løse problemet eller eskalere det til ingeniørteams for at udføre yderligere kontrol af hardwaren.

Resumé

Vi er ankommet til slutningen af denne 10-artikels serie, hvor vi har forsøgt at dække de grundlæggende domæne kompetencer, der kræves for at bestå LFCS eksamen.

Af åbenlyse grunde er det ikke muligt at dække hvert eneste aspekt af disse emner i en enkelt tutorial, og det er derfor, vi håber, at disse artikler har sat dig på rette spor til selv at prøve nye ting og fortsætte med at lære.

Hvis du har spørgsmål eller kommentarer, er de altid velkomne - så tøv ikke med at sende os en linje via nedenstående formular!