Shelli skriptimise ja Linuxi failisüsteemi tõrkeotsingu mõistmine ja õppimine - 10. osa


Linuxi sihtasutus käivitas LFCS sertifikaadi ( Linux Foundation Certified Sysadmin ), uhiuue algatuse, mille eesmärk on võimaldada inimestel kõikjal (ja igal pool) saada põhi- ja kesktaseme sertifikaat operatiivne tugi Linuxi süsteemidele, mis hõlmab töötavate süsteemide ja teenuste toetamist koos üldise seire ja analüüsiga ning nutika otsuste langetamisega, kui tegemist on probleemide ülemise tugimeeskonnaga tõstatamisega.

Vaadake järgmist videot, mis juhatab teid sissejuhatuseks Linux Foundationi sertifitseerimisprogrammi.

See on praeguse 10-õpetuse pika sarja viimane artikkel (10. osa). Selles artiklis keskendume põhilistele shelliskriptidele ja Linuxi failisüsteemide tõrkeotsingule. Mõlemad teemad on vajalikud LFCSi sertifitseerimise eksamiks.

Terminalide ja kestade mõistmine

Selgitame kõigepealt mõned mõisted.

  1. Shell on programm, mis võtab käsud ja annab need käivitatavale operatsioonisüsteemile.
  2. Terminal on programm, mis võimaldab meil lõppkasutajatena kestaga suhelda. Üks terminali näide on GNOME terminal, nagu on näidatud alloleval pildil.

Shelli esmakordsel käivitamisel esitab see käsuviiba (tuntud ka kui käsurida), mis ütleb meile, et kest on valmis alustama käskude vastuvõtmist oma tavalisest sisendseadmest, milleks tavaliselt on klaviatuur.

Kasulike käskude ülevaatamiseks võite viidata selle sarja teisele artiklile (Failide loomiseks, muutmiseks ja manipuleerimiseks käsuga Use - Part 1).

Linux pakub kestade valikut, kõige levinumad järgmised:

Bash tähistab Bourne Again Shell ja on GNU projekti vaikekoor. See sisaldab Korni (ksh) ja C-šelli (csh) kasulikke funktsioone, pakkudes korraga mitmeid täiustusi. See on vaikimisi kest, mida LFCS-i sertifikaadiga kaetud jaotused kasutavad, ja seda kestat kasutame selles õpetuses.

Bourne SHell on vanim kest ja seetõttu on see paljude aastate jooksul olnud paljude UNIX-tüüpi operatsioonisüsteemide vaikekest.

Korn SHell on Unixi kest, mille töötas välja David Korn Bell Labsis 1980-ndate aastate alguses. See ühildub Bourne'i kestaga tahapoole ja sisaldab paljusid C-kesta funktsioone.

Shelliskript pole midagi enamat ega vähem kui tekstifail, mis on muudetud käivitatavaks programmiks, mis ühendab käske, mida shell üksteise järel täidab.

Shelli põhiskriptimine

Nagu varem mainitud, sünnib shelliskript lihttekstifailina. Seega saab meie eelistatud tekstiredaktori abil luua ja redigeerida. Võite kaaluda vi/m kasutamist (vaadake vi Editori kasutamine - selle seeria 2. osa), mis hõlbustab teie süntaksi esiletõstmist.

Sisestage järgmine käsk faili myscript.sh loomiseks ja vajutage sisestusklahvi.

# vim myscript.sh

Shelliskripti kõige esimene rida peab olema järgmine (tuntud ka kui shebang ).

#!/bin/bash

See\" ütleb " operatsioonisüsteemile tõlgi nime, mida tuleks kasutada järgneva teksti käivitamiseks.

Nüüd on aeg lisada meie käsud. Saame selgitada iga käsu või kogu skripti eesmärki, lisades ka kommentaare. Pange tähele, et kest eirab neid ridu, mis algavad naelamärgiga # (selgitavad kommentaarid).

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

Kui skript on kirjutatud ja salvestatud, peame selle käivitatavaks tegema.

# chmod 755 myscript.sh

Enne skripti käivitamist peame ütlema paar sõna keskkonnamuutuja $PATH kohta. Kui me jookseme,

echo $PATH

käsurealt näeme koolonitega eraldatud kataloogide loendi $PATH: sisu, mida otsitakse käivitatava programmi nime sisestamisel. Seda nimetatakse keskkonnamuutujaks, kuna see on osa kestakeskkonnast - teabekogum, mis saab kestale ja selle alamprotsessidele kättesaadavaks, kui kest esimest korda käivitatakse.

Kui sisestame käsu ja vajutame sisestusklahvi Enter, otsib kest kõigist muutujates $$PATH loetletud kataloogidest ja täidab esimese leitud eksemplari. Vaatame näite,

Kui on kaks samanimelist käivitatavat faili, üks failis /usr/local/bin ja teine failis /usr/bin , käivitatakse see, mis asub esimeses kataloogis esiteks, samas kui teist ei arvestata.

Kui me pole oma skripti salvestanud ühte muutujas $PATH loetletud kataloogidest, peame selle täitmiseks lisama faili nimele ./ . Vastasel juhul saame seda käivitada täpselt nagu tavalise käsu korral.

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

Alati, kui peate käsu edukuse või ebaõnnestumise tõttu määrama shelliskriptis erinevad toimimisviisid, kasutate selliste tingimuste määratlemiseks konstruktsiooni if . Selle põhisüntaks on:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Kui TINGIMUS võib olla üks järgmistest (siin tuuakse välja ainult kõige sagedasemad tingimused) ja see vastab tõele, kui:

  1. [-a-fail] → fail on olemas.
  2. [-d fail] → fail on olemas ja see on kataloog.
  3. [-f fail] → fail on olemas ja see on tavaline fail.
  4. [-u fail] → fail on olemas ja selle SUID (seatud kasutajatunnus) bit on määratud.
  5. [-g fail] → fail on olemas ja selle SGID-bit on määratud.
  6. [-k fail] → fail on olemas ja selle kleepuv bit on määratud.
  7. [-r fail] → fail on olemas ja on loetav.
  8. [-s-fail] → fail on olemas ja pole tühi.
  9. [-w fail] → fail on olemas ja kirjutatav.
  10. [-x-fail] on tõene, kui fail on olemas ja see on käivitatav.
  11. [string1 = string2] → stringid on võrdsed.
  12. [string1! = string2] → stringid pole võrdsed.

[int1 op int2] peaks olema osa eelnevast loendist, samas kui järgnevad üksused (näiteks -eq -> on tõesed, kui int1 on võrdne väärtusega int2 .) peaks olema loendi „ lapsed ” loendist [ int1 op int2 ], kus op on üks järgmistest võrdlusoperaatoritest.

  1. -eq -> on tõene, kui int1 on võrdne int2.
  2. -ne -> tõene, kui int1 ei võrdu int2-ga.
  3. -lt -> tõene, kui int1 on väiksem kui int2.
  4. -le -> tõene, kui int1 on väiksem või võrdne int2.
  5. -gt -> tõene, kui int1 on suurem kui int2.
  6. -ge -> tõene, kui int1 on suurem või võrdne int2.

See silmus võimaldab täita väärtuste loendis iga väärtuse jaoks ühte või mitut käsku. Selle põhisüntaks on:

for item in SEQUENCE; do 
		COMMANDS; 
done

Kus element on üldine muutuja, mis tähistab kõiki iteratsiooni ajal järjestuses SEQUENCE olevaid väärtusi.

See silmus võimaldab täita korduvate käskude rida seni, kuni juhtkäsk täidab nulliga (edukalt) väljumisolekuga. Selle põhisüntaks on:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Kus EVALUATION_COMMAND võivad olla mis tahes käsud, mis võivad väljuda staatusega edukas ( 0 ) või ebaõnnestunud (muu kui 0) , ja EXECUTE_COMMANDS võib olla mis tahes programm, skript või shellikonstruktsioon, sealhulgas muud sisestatud tsüklid.

Näitame if-konstruktsiooni ja for-loopi kasutamist järgmise näitega.

Koostame faili koos teenuste loendiga, mida soovime silmapilgul jälgida.

# cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Meie shelliskript peaks välja nägema.

#!/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 silmus loeb faili myservices.txt üks LIST-i element korraga. Seda üksikut elementi tähistab üldine muutuja nimega service. LIST täidetakse väljundiga,

# cat myservices.txt

2). Ülaltoodud käsk on suludesse sulatatud ja sellele eelneb dollarimärk, mis näitab, et seda tuleks korrata LISTi täitmiseks.

3). LIST-i iga elemendi jaoks (see tähendab teenuse muutuja kõiki eksemplare) täidetakse järgmine käsk.

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

Seekord peame enne üldist muutujat (mis tähistab kõiki loendis LIST olevaid elemente) dollarimärgiga näitama, et see on muutuja ja seega tuleks kasutada selle väärtust igas iteratsioonis. Seejärel suunatakse väljund greppi.

Lippu –quiet kasutatakse selleks, et takistada funktsiooni grep ekraanil kuvamast sõnu jooksvaid ridu. Kui see juhtub, tagastab ülaltoodud käsk väljumisoleku 0 (mida if-konstruktsioonis tähistab $? ), kontrollides seega teenuse töötamist.

Väljumise olek kui 0 (st käimasolevat sõna ei leitud systemctl status $service väljundist) näitab, et teenus pole jooksmine.

Võiksime minna veel ühe sammu edasi ja kontrollida, kas myservices.txt on olemas, enne kui proovime isegi for silmusesse siseneda.

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

Võib-olla soovite säilitada tekstifailis hostide loendi ja kasutada skripti, et iga natukese aja tagant kindlaks teha, kas need on pingitavad või mitte (asendage julgelt minu hostide sisu ja proovige ise ).

Shelli sisseehitatud käsk käsib while-tsüklil lugeda reahaaval myhostereid ja määrab iga rea sisu muutuvale hostile, mis edastatakse seejärel käsule 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

Loe ka :

  1. Õpi Shelli skriptimist: juhend algajatelt süsteemiadministraatorile
  2. 5 Shelli skripti, et õppida Shelli programmeerimist

Failisüsteemi tõrkeotsing

Kuigi Linux on väga stabiilne operatsioonisüsteem, ei lahutata mingil põhjusel (näiteks voolukatkestuse tõttu) ühte (või mitut) teie failisüsteemi õigesti ja seega kontrollitakse Linuxi korral automaatselt vigade olemasolu taaskäivitatakse.

Lisaks kontrollib see iga kord, kui süsteem tavalise käivitamise ajal käivitub, alati enne nende paigaldamist failisüsteemide terviklikkust. Mõlemal juhul kasutatakse seda tööriista nimega fsck (\ " failisüsteemi kontroll ").

fsck kontrollib mitte ainult failisüsteemide terviklikkust, vaid proovib ka korrigeerida rikutud failisüsteeme, kui talle seda tehakse. Sõltuvalt kahjustuse tõsidusest võib fsck õnnestuda või mitte; kui see juhtub, paigutatakse taastatud failide osad kataloogi kadunud + leitud , mis asub iga failisüsteemi juures.

Lõpuks peame märkima, et vastuolusid võib juhtuda ka siis, kui proovime USB-draivi eemaldada, kui operatsioonisüsteem sellele veel kirjutab, ja see võib põhjustada isegi riistvara kahjustusi.

Fscki põhisüntaks on järgmine:

# fsck [options] filesystem

Failisüsteemi fsck abil kontrollimiseks peame selle kõigepealt lahti ühendama.

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

Lisaks lipule -y saame kasutada valikut -a failisüsteemide automaatseks parandamiseks ilma küsimusi esitamata ja sundida kontrolli ka siis, kui failisüsteem näib puhas.

# fsck -af /dev/sdg1

Kui meid huvitab ainult viga (proovimata esialgu midagi parandada), võime käivitada fscki valiku -n abil, mis väljastab failisüsteemi probleemid standardsesse väljundisse.

# fsck -n /dev/sdg1

Sõltuvalt fscki väljundis olevatest tõrketeadetest teame, kas saame proovida probleemi ise lahendada või laiendada seda insenerimeeskondadele riistvara edasiseks kontrollimiseks.

Kokkuvõte

Oleme jõudnud selle 10-artikli seeria lõppu, kus oleme proovinud katta LFCS -eksami sooritamiseks vajalikud põhidomeenipädevused.

Arusaadavatel põhjustel ei ole nende teemade kõiki aspekte võimalik üheski õpetuses käsitleda ja seetõttu loodame, et need artiklid on teid õigele teele pannud, et ise uusi asju proovida ja edasi õppida.

Kui teil on küsimusi või kommentaare, on need alati teretulnud - seega ärge kartke meile allpool oleva vormi kaudu rida kirjutada!