Website-Suche

Grundlegendes Shell-Scripting und Fehlerbehebung bei Linux-Dateisystemen verstehen und erlernen - Teil 10


Die Linux Foundation hat die LFCS-Zertifizierung (Linux Foundation Certified Sysadmin) ins Leben gerufen, eine brandneue Initiative, deren Ziel es Einzelpersonen überall (und überall) ermöglichen soll, sich für den grundlegenden bis mittleren Betriebssupport für Linux-Systeme zertifizieren zu lassen, der die Unterstützung laufender Systeme und Dienste sowie die allgemeine Überwachung und Analyse sowie eine intelligente Entscheidungsfindung umfasst, wenn es darum geht, Probleme an die oberen Support-Teams zu richten.

Sehen Sie sich das folgende Video an, das Ihnen eine Einführung in das Linux Foundation-Zertifizierungsprogramm bietet.

Dies ist der letzte Artikel (Teil 10) der vorliegenden 10 Tutorials umfassenden Serie. In diesem Artikel konzentrieren wir uns auf die grundlegende Erstellung von Shell-Skripten und die Fehlerbehebung von Linux-Dateisystemen. Beide Themen sind für die LFCS-Zertifizierungsprüfung erforderlich.

Grundlegendes zu Terminals und Schalen

Lassen Sie uns zunächst einige Konzepte klären.

  1. Eine Shell ist ein Programm, das Befehle entgegennimmt und sie dem Betriebssystem zur Ausführung gibt.
  2. Ein Terminal ist ein Programm, das es uns als Endbenutzern ermöglicht, mit der Shell zu interagieren. Ein Beispiel für ein Terminal ist das GNOME-Terminal, wie in der folgenden Abbildung gezeigt.

Wenn wir eine Shell zum ersten Mal starten, wird eine Eingabeaufforderung (auch als Befehlszeile bezeichnet) angezeigt, die uns mitteilt, dass die Shell bereit ist, Befehle von ihrem Standardeingabegerät, bei dem es sich normalerweise um die Tastatur handelt, zu akzeptieren.

Möglicherweise möchten Sie einen anderen Artikel in dieser Reihe (Verwenden von Befehlen zum Erstellen, Bearbeiten und Bearbeiten von Dateien – Teil 1) lesen, um einige nützliche Befehle zu überprüfen.

Linux bietet eine Reihe von Optionen für Shells, wobei die folgenden die gebräuchlichsten sind:

bash-Shell

Bash steht für Bourne Again SHell und ist die Standard-Shell des GNU-Projekts. Es enthält nützliche Funktionen aus der Korn-Shell (ksh) und der C-Shell (csh) und bietet gleichzeitig mehrere Verbesserungen. Dies ist die Standard-Shell, die von den Distributionen verwendet wird, die in der LFCS-Zertifizierung behandelt werden, und es ist die Shell, die wir in diesem Tutorial verwenden werden.

sh Shell

Die Bourne SHell ist die älteste Shell und daher seit vielen Jahren die Standard-Shell vieler UNIX-ähnlicher Betriebssysteme.

ksh Shell

Die Korn SHell ist eine Unix-Shell, die Anfang der 1980er Jahre von David Korn in den Bell Labs entwickelt wurde. Sie ist abwärtskompatibel mit der Bourne-Schale und enthält viele Funktionen der C-Granate.

Ein Shell-Skript ist nicht mehr und nicht weniger als eine Textdatei, die in ein ausführbares Programm umgewandelt wird, das Befehle kombiniert, die von der Shell nacheinander ausgeführt werden.

Grundlegendes Shell-Scripting

Wie bereits erwähnt, wird ein Shell-Skript als reine Textdatei erstellt. Somit kann es mit unserem bevorzugten Texteditor erstellt und bearbeitet werden. Sie können die Verwendung von vi/m in Betracht ziehen (siehe Verwendung des vi-Editors – Teil 2 dieser Serie), das eine Syntaxhervorhebung bietet.

Geben Sie den folgenden Befehl ein, um eine Datei mit dem Namen myscript.sh zu erstellen, und drücken Sie die Eingabetaste.

# vim myscript.sh

Die allererste Zeile eines Shell-Skripts muss wie folgt lauten (auch als Shebang bezeichnet).

#!/bin/bash

Es "teilt" dem Betriebssystem den Namen des Interpreters mit, der zum Ausführen des folgenden Textes verwendet werden soll.

Jetzt ist es an der Zeit, unsere Befehle hinzuzufügen. Wir können den Zweck jedes Befehls oder des gesamten Skripts verdeutlichen, indem wir auch Kommentare hinzufügen. Beachten Sie, dass die Shell die Zeilen ignoriert, die mit einem Nummernzeichen # beginnen (erklärende Kommentare).

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

Sobald das Skript geschrieben und gespeichert wurde, müssen wir es ausführbar machen.

# chmod 755 myscript.sh

Bevor wir unser Skript ausführen, müssen wir ein paar Worte über die Umgebungsvariable ` PATH sagen. Wenn wir rennen,

echo $PATH

In der Befehlszeile sehen wir den Inhalt von ` PATH: eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die durchsucht werden, wenn wir den Namen eines ausführbaren Programms eingeben. Sie wird als Umgebungsvariable bezeichnet, da sie Teil der Shell-Umgebung ist – einer Reihe von Informationen, die für die Shell und ihre untergeordneten Prozesse verfügbar werden, wenn die Shell zum ersten Mal gestartet wird.

Wenn wir einen Befehl eingeben und die Eingabetaste drücken, durchsucht die Shell alle Verzeichnisse, die in der Variablen ` PATH aufgeführt sind, und führt die erste Instanz aus, die gefunden wird. Sehen wir uns ein Beispiel an:

Wenn es zwei ausführbare Dateien mit demselben Namen gibt, eine in /usr/local/bin und eine in /usr/bin, wird die Datei im ersten Verzeichnis zuerst ausgeführt, während die andere ignoriert wird.

Wenn wir unser Skript nicht in einem der Verzeichnisse gespeichert haben, die in der Variablen ` PATH aufgeführt sind, müssen wir ./ an den Dateinamen anhängen, um es auszuführen. Andernfalls können wir es genauso ausführen, wie wir es mit einem normalen Befehl tun würden.

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

Bedingungen

Wann immer Sie verschiedene Handlungsoptionen angeben müssen, die in einem Shellskript aufgrund des Erfolgs oder Misserfolgs eines Befehls ausgeführt werden sollen, verwenden Sie das if-Konstrukt, um solche Bedingungen zu definieren. Die grundlegende Syntax lautet:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Dabei kann CONDITION eine der folgenden Werte sein (hier werden nur die häufigsten Bedingungen genannt) und wird in folgenden Fällen als wahr ausgewertet:

  1. [ -a Datei ] → Datei existiert.
  2. [ -d Datei ] → Datei existiert und ist ein Verzeichnis.
  3. [ -f Datei ] →Datei existiert und ist eine reguläre Datei.
  4. [ -u file ] →Datei existiert und ihr SUID-Bit (set user ID) ist gesetzt.
  5. [ -g file ] →Datei existiert und ihr SGID-Bit ist gesetzt.
  6. [ -k file ] →Datei existiert und ihr Sticky-Bit ist gesetzt.
  7. [ -r Datei ] →Datei existiert und ist lesbar.
  8. [ -s Datei ]→ Datei existiert und ist nicht leer.
  9. [ -w Datei ]→Datei existiert und ist beschreibbar.
  10. [ -x file ] ist true, wenn die Datei existiert und ausführbar ist.
  11. [ string1=string2 ] → die Zeichenfolgen gleich sind.
  12. [ string1 != string2 ] →die Zeichenfolgen sind ungleich.

[ int1 op int2 ] sollte Teil der obigen Liste sein, während die folgenden Elemente (z. B. -eq –> ist wahr, wenn int1 gleich int2 ist.) eine "untergeordnete" Liste von [ int1 op int2 ] sein sollten, wobei op einer der folgenden Vergleichsoperatoren ist.

  1. -eq –> ist wahr, wenn int1 gleich int2 ist.
  2. -ne –> true, wenn int1 nicht gleich int2 ist.
  3. -lt –> true, wenn int1 kleiner als int2 ist.
  4. -le –> true, wenn int1 kleiner oder gleich int2 ist.
  5. -gt –> true, wenn int1 größer als int2 ist.
  6. -ge –> true, wenn int1 größer oder gleich int2 ist.

For-Schleifen

Diese Schleife ermöglicht es, einen oder mehrere Befehle für jeden Wert in einer Liste von Werten auszuführen. Die grundlegende Syntax lautet:

for item in SEQUENCE; do 
		COMMANDS; 
done

Dabei ist item eine generische Variable, die jeden Wert in SEQUENCE während jeder Iteration darstellt.

While-Schleifen

Diese Schleife ermöglicht es, eine Reihe von sich wiederholenden Befehlen auszuführen, solange der Steuerbefehl mit einem Exit-Status gleich Null (erfolgreich) ausgeführt wird. Die grundlegende Syntax lautet:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Dabei kann EVALUATION_COMMAND sich um beliebige Befehle handeln, die mit einem erfolgreichen (0) oder fehlgeschlagenen Status (außer 0) beendet werden können, und EXECUTE_COMMANDS kann ein beliebiges Programm, Skript oder Shellkonstrukt sein, einschließlich anderer verschachtelter Schleifen.

Alles zusammenfügen

Wir werden die Verwendung des if-Konstrukts und der for-Schleife anhand des folgenden Beispiels veranschaulichen.

Bestimmen, ob ein Dienst in einer systemd-basierten Distribution ausgeführt wird

Erstellen wir eine Datei mit einer Liste von Diensten, die wir auf einen Blick überwachen möchten.

# cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Unser Shell-Skript sollte wie folgt aussehen.

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

Lassen Sie uns erklären, wie das Skript funktioniert.

1). Die for-Schleife liest die myservices.txt-Datei jeweils ein Element von LIST. Dieses einzelne Element wird durch die generische Variable service bezeichnet. Die LIST wird mit der Ausgabe von gefüllt,

# cat myservices.txt

2). Der obige Befehl ist in Klammern gesetzt und mit einem Dollarzeichen versehen, um anzuzeigen, dass er ausgewertet werden soll, um die LIST zu füllen, über die wir iterieren werden.

3). Für jedes Element von LIST (d.h. für jede Instanz der Service-Variablen) wird der folgende Befehl ausgeführt.

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

Dieses Mal müssen wir unserer generischen Variablen (die jedes Element in LIST darstellt) ein Dollarzeichen voranstellen, um anzuzeigen, dass es sich um eine Variable handelt und daher ihr Wert in jeder Iteration verwendet werden sollte. Die Ausgabe wird dann an grep weitergeleitet.

Das –quiet-Flag wird verwendet, um zu verhindern, dass grep die Zeilen, in denen das Wort running erscheint, auf dem Bildschirm anzeigt. In diesem Fall gibt der obige Befehl den Beendigungsstatus 0 zurück (dargestellt durch $? im if-Konstrukt), wodurch überprüft wird, ob der Dienst ausgeführt wird.

Ein Beendigungsstatus, der sich von 0 unterscheidet (d. h. das Wort running wurde in der Ausgabe von systemctl status $service nicht gefunden), gibt an, dass der Dienst nicht ausgeführt wird.

Wir könnten noch einen Schritt weiter gehen und das Vorhandensein von myservices.txt überprüfen, bevor wir überhaupt versuchen, in die for-Schleife einzutreten.

#!/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
Pingen einer Reihe von Netzwerk- oder Internet-Hosts für Antwortstatistiken

Sie können eine Liste von Hosts in einer Textdatei pflegen und von Zeit zu Zeit ein Skript verwenden, um zu bestimmen, ob sie pingbar sind oder nicht (Sie können den Inhalt von myhosts ersetzen und es selbst versuchen).

Der eingebaute Befehl read shell weist die while-Schleife an, myhosts Zeile für Zeile zu lesen, und weist den Inhalt jeder Zeile der Variablen host zu, die dann an den Ping-Befehl übergeben wird.

#!/bin/bash

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

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

Lesen Sie auch:

  1. Lernen Sie Shell-Scripting: Ein Leitfaden vom Neuling bis zum Systemadministrator
  2. 5 Shell-Skripte zum Erlernen der Shell-Programmierung

Fehlerbehebung bei Dateisystemen

Obwohl Linux ein sehr stabiles Betriebssystem ist, wird bei einem Absturz aus irgendeinem Grund (z. B. aufgrund eines Stromausfalls) eines (oder mehrere) Ihrer Dateisysteme nicht ordnungsgemäß ausgehängt und daher beim Neustart von Linux automatisch auf Fehler überprüft.

Darüber hinaus überprüft das System jedes Mal, wenn es während eines normalen Bootvorgangs startet, die Integrität der Dateisysteme, bevor es gemountet wird. In beiden Fällen erfolgt dies mit einem Tool namens fsck ("file system check ").

FSCK überprüft nicht nur die Integrität von Dateisystemen, sondern versucht auch, beschädigte Dateisysteme zu reparieren, wenn es dazu aufgefordert wird. Abhängig von der Schwere des Schadens kann fsck erfolgreich sein oder nicht; Wenn dies der Fall ist, werden die wiederhergestellten Teile der Dateien im Verzeichnis Lost+Found abgelegt, das sich im Stammverzeichnis jedes Dateisystems befindet.

Zu guter Letzt müssen wir darauf hinweisen, dass es auch dann zu Ungereimtheiten kommen kann, wenn wir versuchen, ein USB-Laufwerk zu entfernen, während das Betriebssystem noch darauf schreibt, und sogar zu Hardwareschäden führen können.

Die grundlegende Syntax von fsck lautet wie folgt:

# fsck [options] filesystem
Ein Dateisystem auf Fehler überprüfen und versuchen, es automatisch zu reparieren

Um ein Dateisystem mit fsck zu überprüfen, müssen wir es zuerst aushängen.

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

Neben dem Flag -y können wir die Option -a verwenden, um die Dateisysteme automatisch zu reparieren, ohne Fragen zu stellen, und die Prüfung auch dann zu erzwingen, wenn das Dateisystem sauber aussieht.

# fsck -af /dev/sdg1

Wenn wir nur daran interessiert sind, herauszufinden, was falsch ist (ohne vorerst zu versuchen, irgendetwas zu beheben), können wir fsck mit der Option -n ausführen, wodurch die Dateisystemprobleme in die Standardausgabe ausgegeben werden.

# fsck -n /dev/sdg1

Abhängig von den Fehlermeldungen in der Ausgabe von fsck wissen wir, ob wir versuchen können, das Problem selbst zu lösen, oder ob wir es an die Entwicklungsteams weiterleiten können, um weitere Überprüfungen der Hardware durchzuführen.

Zusammenfassung

Wir sind am Ende dieser 10-Artikel-Serie angelangt, in der wir versucht haben, die grundlegenden Domänenkompetenzen abzudecken, die zum Bestehen der LFCS-Prüfung erforderlich sind.

Aus offensichtlichen Gründen ist es nicht möglich, jeden einzelnen Aspekt dieser Themen in einem einzigen Tutorial abzudecken, und deshalb hoffen wir, dass diese Artikel Sie auf den richtigen Weg gebracht haben, um selbst neue Dinge auszuprobieren und weiter zu lernen.

Wenn Sie Fragen oder Kommentare haben, sind diese immer willkommen – zögern Sie also nicht, uns über das untenstehende Formular eine Nachricht zu schreiben!

Verwandte Artikel: