Wyszukiwanie w witrynie

Zrozumienie i nauka podstawowych skryptów powłoki i rozwiązywania problemów z systemem plików Linux — część 10


Fundacja Linux uruchomiła certyfikację LFCS (Linux Foundation Certified Sysadmin), zupełnie nową inicjatywę, której celem jest umożliwienie osobom na całym świecie (i gdziekolwiek) zdobycia certyfikatu w zakresie podstawowym i średniozaawansowanym wsparcie operacyjne dla systemów Linux, które obejmuje wspieranie działających systemów i usług, wraz z ogólnym monitorowaniem i analizą, a także podejmowanie mądrych decyzji, jeśli chodzi o zgłaszanie problemów wyższym zespołom wsparcia.

Obejrzyj poniższy film, który stanowi wprowadzenie do Programu certyfikacji Linux Foundation.

To jest ostatni artykuł (część 10) z obecnej serii składającej się z 10 samouczków. W tym artykule skupimy się na podstawowych skryptach powłoki i rozwiązywaniu problemów z systemami plików Linux. Obydwa tematy są wymagane na egzaminie certyfikacyjnym LFCS.

Zrozumienie terminali i powłok

Wyjaśnijmy najpierw kilka pojęć.

  1. Powłoka to program, który pobiera polecenia i przekazuje je systemowi operacyjnemu do wykonania.
  2. Terminal to program, który pozwala nam, użytkownikom końcowym, na interakcję z powłoką. Jednym z przykładów terminala jest terminal GNOME, jak pokazano na poniższym obrazku.

Kiedy po raz pierwszy uruchamiamy powłokę, wyświetla się wiersz poleceń (zwany także wierszem poleceń), który informuje nas, że powłoka jest gotowa do przyjmowania poleceń ze swojego standardowego urządzenia wejściowego, którym zwykle jest klawiatura.

Możesz zapoznać się z innym artykułem z tej serii (Używanie poleceń do tworzenia, edytowania i manipulowania plikami – część 1), aby przejrzeć przydatne polecenia.

Linux udostępnia szereg opcji dla powłok, z których najczęstsze są:

walnij Shellem

Bash oznacza Bourne Again SHell i jest domyślną powłoką Projektu GNU. Zawiera przydatne funkcje powłoki Korn (ksh) i powłoki C (csh), oferując jednocześnie kilka ulepszeń. Jest to domyślna powłoka używana w dystrybucjach objętych certyfikatem LFCS i właśnie tej powłoki będziemy używać w tym samouczku.

sh Shell

Bourne SHell jest najstarszą powłoką i dlatego przez wiele lat była domyślną powłoką wielu systemów operacyjnych typu UNIX.

ksh Shell

Korn SHell to powłoka Uniksa opracowana przez Davida Korna w Bell Labs na początku lat 80-tych. Jest wstecznie kompatybilny z powłoką Bourne'a i zawiera wiele funkcji powłoki C.

Skrypt powłoki to nic innego jak plik tekstowy zamieniony w program wykonywalny, który łączy w sobie polecenia wykonywane przez powłokę, jedno po drugim.

Podstawowe skrypty powłoki

Jak wspomniano wcześniej, skrypt powłoki powstaje w postaci zwykłego pliku tekstowego. W ten sposób można je tworzyć i edytować za pomocą naszego preferowanego edytora tekstu. Możesz rozważyć użycie vi/m (patrz Użycie edytora vi – część 2 tej serii), który dla Twojej wygody oferuje podświetlanie składni.

Wpisz następujące polecenie, aby utworzyć plik o nazwie myscript.sh i naciśnij klawisz Enter.

vim myscript.sh

Pierwsza linia skryptu powłoki musi wyglądać następująco (znana również jako shebang).

#!/bin/bash

Przekazuje” systemowi operacyjnemu nazwę interpretera, którego należy użyć do uruchomienia poniższego tekstu.

Teraz czas na dodanie naszych poleceń. Możemy wyjaśnić cel każdego polecenia lub całego skryptu, dodając również komentarze. Należy zauważyć, że powłoka ignoruje te linie zaczynające się od znaku funta # (komentarze wyjaśniające).

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

Po napisaniu i zapisaniu skryptu musimy uczynić go wykonywalnym.

chmod 755 myscript.sh

Zanim uruchomimy nasz skrypt, musimy powiedzieć kilka słów o zmiennej środowiskowej '96 PATH. Jeśli pobiegniemy,

echo $PATH

z linii poleceń zobaczymy zawartość &96 PATH: rozdzielonej dwukropkami listy katalogów, które będą przeszukiwane po wpisaniu nazwy programu wykonywalnego. Nazywa się ją zmienną środowiskową, ponieważ jest częścią środowiska powłoki — zestawu informacji, które stają się dostępne dla powłoki i jej procesów potomnych przy pierwszym uruchomieniu powłoki.

Kiedy wpiszemy polecenie i naciśniemy Enter, powłoka przeszuka wszystkie katalogi wymienione w zmiennej #96 PATH i wykona pierwszą znalezioną instancję. Zobaczmy przykład,

Jeśli istnieją dwa pliki wykonywalne o tej samej nazwie, jeden w /usr/local/bin i drugi w /usr/bin, zostanie wykonany plik z pierwszego katalogu pierwszy, podczas gdy drugi zostanie pominięty.

Jeśli nie zapisaliśmy naszego skryptu w jednym z katalogów wymienionych w zmiennej '96 PATH, musimy do nazwy pliku dodać ./, aby wykonać To. W przeciwnym razie możemy go uruchomić tak samo, jak w przypadku zwykłego polecenia.

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

Warunki

Ilekroć zajdzie potrzeba określenia różnych sposobów działania w skrypcie powłoki, w wyniku powodzenia lub niepowodzenia polecenia, użyjesz konstrukcji if w celu zdefiniowania takich warunków. Jego podstawowa składnia to:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Gdzie CONDITION może być jednym z poniższych (przytaczane są tutaj tylko najczęstsze warunki) i ma wartość true, gdy:

  1. [ -a plik ] → plik istnieje.
  2. [ -d plik ] → plik istnieje i jest katalogiem.
  3. [ -f plik ] →plik istnieje i jest zwykłym plikiem.
  4. [ -u plik ] →plik istnieje i jego bit SUID (ustaw identyfikator użytkownika) jest ustawiony.
  5. [ -g plik ] →plik istnieje i jego bit SGID jest ustawiony.
  6. [ -k plik ] →plik istnieje i jego bit trwały jest ustawiony.
  7. [ -r plik ] →plik istnieje i można go odczytać.
  8. [ -s plik ] → plik istnieje i nie jest pusty.
  9. [ -w plik ] → plik istnieje i można go zapisywać.
  10. [ -x plik ] ma wartość true, jeśli plik istnieje i jest wykonywalny.
  11. [ ciąg1=ciąg2 ] → ciągi są równe.
  12. [ ciąg1 != ciąg2 ] →łańcuchy nie są równe.

[ int1 op int2 ] powinien być częścią powyższej listy, natomiast elementy następujące po nim (na przykład -eq –> mają wartość true, jeśli int1 jest równe int2.) powinno być listą „dzieci” zawierającą [ int1 op int2 ] gdzie op jest jednym z następujących operatorów porównania.

  1. -eq –> ma wartość true, jeśli int1 jest równe int2.
  2. -ne –> prawda, jeśli liczba int1 nie jest równa int2.
  3. -lt –> prawda, jeśli liczba int1 jest mniejsza niż int2.
  4. -le –> prawda, jeśli liczba int1 jest mniejsza lub równa int2.
  5. -gt –> prawda, jeśli liczba int1 jest większa niż int2.
  6. -ge –> prawda, jeśli int1 jest większe lub równe int2.

Dla pętli

Pętla ta umożliwia wykonanie jednego lub większej liczby poleceń dla każdej wartości na liście wartości. Jego podstawowa składnia to:

for item in SEQUENCE; do 
		COMMANDS; 
done

Gdzie element jest zmienną ogólną reprezentującą każdą wartość w SEQUENCE podczas każdej iteracji.

Podczas gdy pętle

Pętla ta pozwala na wykonanie serii powtarzalnych poleceń, o ile polecenie sterujące zostanie wykonane ze statusem wyjścia równym zero (pomyślnie). Jego podstawowa składnia to:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Gdzie EVALUATION_COMMAND może oznaczać dowolne polecenie(a), które może zakończyć się sukcesem (0) lub niepowodzeniem (innym niż 0) oraz EXECUTE_COMMANDS może być dowolnym programem, skryptem lub konstrukcją powłoki, łącznie z innymi zagnieżdżonymi pętlami.

Kładąc wszystko razem

Użycie konstrukcji if i pętli for zademonstrujemy na poniższym przykładzie.

Ustalanie, czy usługa działa w dystrybucji opartej na systemie

Stwórzmy plik z listą usług, które chcemy na pierwszy rzut oka monitorować.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Nasz skrypt powłoki powinien wyglądać tak.

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

Wyjaśnijmy, jak działa skrypt.

1). Pętla for odczytuje plik myservices.txt po jednym elemencie LISTY. Ten pojedynczy element jest oznaczony zmienną ogólną o nazwie service. LISTA jest wypełniana danymi wyjściowymi,

cat myservices.txt

2). Powyższe polecenie jest ujęte w nawiasy i poprzedzone znakiem dolara, aby wskazać, że powinno zostać wykonane w celu zapełnienia LISTY, po której będziemy iterować.

3). Dla każdego elementu LISTY (czyli każdej instancji zmiennej serwisowej) zostanie wykonane poniższe polecenie.

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

Tym razem musimy poprzedzić naszą zmienną ogólną (która reprezentuje każdy element na LISCIE) znakiem dolara, aby wskazać, że jest to zmienna i dlatego należy użyć jej wartości w każdej iteracji. Dane wyjściowe są następnie przesyłane do grep.

Flaga –quiet służy do zapobiegania wyświetlaniu przez grep na ekranie linii, w których pojawia się słowo running. Gdy tak się stanie, powyższe polecenie zwraca status wyjścia 0 (reprezentowany przez $? w konstrukcji if), sprawdzając w ten sposób, czy usługa jest uruchomiona.

Status wyjścia inny niż 0 (co oznacza, że działające słowo nie zostało znalezione w wynikach systemctl status $service) wskazuje, że usługa nie jest działanie.

Moglibyśmy pójść o krok dalej i sprawdzić, czy plik myservices.txt istnieje, zanim jeszcze spróbujemy wejść w pętlę 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
Pingowanie szeregu hostów sieciowych lub internetowych w celu uzyskania statystyk odpowiedzi

Możesz zachować listę hostów w pliku tekstowym i od czasu do czasu używać skryptu do sprawdzania, czy można je pingować, czy nie (możesz zastąpić zawartość myhosts i spróbować sam ).

Wbudowane polecenie read powłoki nakazuje pętli while odczytywanie myhosts wiersz po wierszu i przypisuje zawartość każdego wiersza do zmiennej host, która jest następnie przekazywana do polecenia 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

Przeczytaj także:

  1. Naucz się skryptów powłoki: przewodnik od nowicjuszy do administratora systemu
  2. 5 skryptów powłoki do nauki programowania powłoki

Rozwiązywanie problemów z systemem plików

Chociaż Linux jest bardzo stabilnym systemem operacyjnym, jeśli z jakiegoś powodu ulegnie awarii (na przykład z powodu przerwy w dostawie prądu), jeden (lub więcej) systemów plików nie zostanie poprawnie odmontowany i w związku z tym zostanie automatycznie sprawdzony pod kątem błędów podczas uruchamiania systemu Linux zostaje uruchomiony ponownie.

Ponadto za każdym razem, gdy system uruchamia się podczas normalnego rozruchu, zawsze sprawdza integralność systemów plików przed ich zamontowaniem. W obu przypadkach odbywa się to za pomocą narzędzia o nazwie fsck („sprawdzanie systemu plików”).

fsck nie tylko sprawdzi integralność systemów plików, ale także spróbuje naprawić uszkodzone systemy plików, jeśli zostanie tak poinstruowany. W zależności od powagi uszkodzeń fsck może się powieść lub nie; gdy tak się stanie, odzyskane części plików są umieszczane w katalogu lost+found, znajdującym się w katalogu głównym każdego systemu plików.

Na koniec musimy pamiętać, że niespójności mogą również wystąpić, jeśli spróbujemy wyjąć dysk USB, gdy system operacyjny nadal na nim zapisuje, co może nawet spowodować uszkodzenie sprzętu.

Podstawowa składnia fsck jest następująca:

fsck [options] filesystem
Sprawdzanie systemu plików pod kątem błędów i próba automatycznej naprawy

Aby sprawdzić system plików za pomocą fsck, musimy go najpierw odmontować.

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

Oprócz flagi -y możemy użyć opcji -a, aby automatycznie naprawić systemy plików bez zadawania żadnych pytań i wymusić sprawdzenie, nawet jeśli system plików wygląda na czysty.

fsck -af /dev/sdg1

Jeśli chcemy tylko dowiedzieć się, co jest nie tak (bez prób naprawiania czegokolwiek na razie), możemy uruchomić fsck z opcją -n, która wyśle problemy z systemem plików na standardowe wyjście.

fsck -n /dev/sdg1

W zależności od komunikatów o błędach wyświetlanych w wynikach polecenia fsck będziemy wiedzieć, czy możemy spróbować rozwiązać problem samodzielnie, czy też przekazać go zespołom inżynierskim w celu przeprowadzenia dalszych kontroli sprzętu.

Streszczenie

Dotarliśmy do końca tej serii 10 artykułów, w których próbowaliśmy omówić podstawowe kompetencje wymagane do zdania egzaminu LFCS.

Z oczywistych powodów nie jest możliwe omówienie każdego aspektu tych tematów w jednym samouczku i dlatego mamy nadzieję, że te artykuły naprowadziły Cię na właściwą drogę do samodzielnego wypróbowania nowych rzeczy i kontynuowania nauki.

Jeśli masz jakieś pytania lub uwagi, są one zawsze mile widziane – nie wahaj się więc napisać do nas za pomocą poniższego formularza!