ウェブサイト検索

基本的なシェル スクリプトと Linux ファイルシステムのトラブルシューティングの理解と学習 - パート 10


Linux Foundation は、LFCS 認定 (Linux Foundation Certified Sysadmin) を開始しました。これは、どこにいても (どこにいても) 個人が初級から中級の認定を取得できるようにすることを目的としたまったく新しい取り組みです。 Linux システムの運用サポートには、実行中のシステムとサービスのサポート、全体的な監視と分析、さらに上層のサポート チームに問題を提起する際の賢明な意思決定が含まれます。

Linux Foundation 認定プログラムの概要を説明する次のビデオをご覧ください。

これは、10 回にわたるチュートリアルの長いシリーズの最後の記事 (パート 10) です。この記事では、基本的なシェル スクリプトと Linux ファイル システムのトラブルシューティングに焦点を当てます。 LFCS 認定試験には両方のトピックが必須です。

ターミナルとシェルについて理解する

まずいくつかの概念を明確にしましょう。

  1. シェルはコマンドを受け取り、それをオペレーティング システムに与えて実行させるプログラムです。
  2. ターミナルは、エンド ユーザーがシェルと対話できるようにするプログラムです。端末の一例は、以下の図に示す GNOME 端末です。

シェルを初めて起動すると、コマンド プロンプト (コマンド ラインとも呼ばれます) が表示され、シェルが標準入力デバイス (通常はキーボード) からのコマンドの受け入れを開始する準備ができていることがわかります。

このシリーズの別の記事 (コマンドを使用してファイルを作成、編集、操作する – パート 1) を参照して、いくつかの便利なコマンドを確認してください。

Linux ではシェルのさまざまなオプションが提供されており、最も一般的なものは次のとおりです。

バッシュシェル

BashBourne Again SHell の略で、GNU プロジェクトのデフォルトのシェルです。 Korn シェル (ksh) と C シェル (csh) の便利な機能が組み込まれており、同時にいくつかの改善が施されています。これは、LFCS 認定の対象となるディストリビューションで使用されるデフォルトのシェルであり、このチュートリアルで使用するシェルです。

sh シェル

Bourne SHell は最も古いシェルであるため、長年にわたって多くの UNIX 系オペレーティング システムのデフォルト シェルとして使用されてきました。

ksh シェル

Korn SHell は、1980 年代初頭にベル研究所の David Korn によって開発された Unix シェルです。 Bourne シェルとの下位互換性があり、C シェルの多くの機能が含まれています。

シェルスクリプトは、シェルによって実行されるコマンドを次々と組み合わせて実行可能プログラムに変換されたテキストファイルにほかなりません。

基本的なシェルスクリプト

前述したように、シェル スクリプトはプレーン テキスト ファイルとして生成されます。したがって、お好みのテキスト エディタを使用して作成および編集できます。便利な構文ハイライト機能を備えた vi/m の使用を検討することもできます (「vi エディターの使用法 – このシリーズのパート 2」を参照)。

次のコマンドを入力して myscript.sh という名前のファイルを作成し、Enter キーを押します。

vim myscript.sh

シェル スクリプトの最初の行は次のようにする必要があります (シバン とも呼ばれます)。

#!/bin/bash

これは、後続のテキストを実行するために使用するインタープリタの名前をオペレーティング システムに「伝えます」。

次に、コマンドを追加します。コメントを追加することで、各コマンドまたはスクリプト全体の目的を明確にすることができます。シェルはシャープ記号 # で始まる行 (説明コメント) を無視することに注意してください。

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

スクリプトを作成して保存したら、それを実行可能にする必要があります。

chmod 755 myscript.sh

スクリプトを実行する前に、` PATH 環境変数について少し説明する必要があります。走れば、

echo $PATH

コマンドラインから ` PATH: の内容が表示されます。これは、実行可能プログラムの名前を入力したときに検索されるディレクトリのコロンで区切られたリストです。これはシェル環境の一部であるため、環境変数と呼ばれます。これは、シェルが最初に起動されたときにシェルとその子プロセスで利用できるようになる一連の情報です。

コマンドを入力して Enter キーを押すと、シェルは ` PATH 変数にリストされているすべてのディレクトリを検索し、見つかった最初のインスタンスを実行します。例を見てみましょう。

同じ名前の実行可能ファイルが 2 つあり、1 つは /usr/local/bin に、もう 1 つは /usr/bin にある場合、最初のディレクトリにある実行可能ファイルが実行されます。 1 つ目は無視されます。

` PATH 変数にリストされているディレクトリのいずれかにスクリプトを保存していない場合、実行するにはファイル名に ./ を追加する必要があります。それ。それ以外の場合は、通常のコマンドと同じように実行できます。

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

条件文

コマンドの成功または失敗の結果として、シェル スクリプトで実行されるさまざまなアクションを指定する必要がある場合は、if 構造を使用してそのような条件を定義します。その基本的な構文は次のとおりです。

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

ここで、CONDITION は次のいずれか (ここでは最も頻繁に使用される条件のみが引用されています) であり、次の場合に true と評価されます。

  1. [ -a file ] → ファイルが存在します。
  2. [ -d file ] → ファイルは存在し、ディレクトリです。
  3. [ -f file ] →ファイルは存在し、通常のファイルです。
  4. [ -u file ] →ファイルが存在し、その SUID (ユーザー ID 設定) ビットが設定されています。
  5. [ -g file ] →ファイルが存在し、その SGID ビットが設定されています。
  6. [ -k file ] →ファイルが存在し、そのスティッキー ビットが設定されています。
  7. [ -r file ] →ファイルは存在し、読み取り可能です。
  8. [ -s file ]→ ファイルは存在しますが、空ではありません。
  9. [ -w file ]→ファイルは存在し、書き込み可能です。
  10. [ -x file ] は、ファイルが存在し、実行可能である場合に true です。
  11. [ string1=string2 ] → 文字列は等しいです。
  12. [ string1 != string2 ] →文字列は等しくありません。

[ int1 op int2 ] は前述のリストの一部である必要がありますが、その後の項目 (たとえば、int1 の場合は -eq –> が true になります) > は int2 に等しい) は [ int1 op int2 ] の「」リストである必要があります。ここで、op次の比較演算子のいずれかです。

  1. -eq –> は、int1 が int2 と等しい場合に true です。
  2. -ne –> int1 が int2 と等しくない場合は true。
  3. -lt –> int1 が int2 より小さい場合は true。
  4. -le –> int1 が int2 以下の場合は true。
  5. -gt –> int1 が int2 より大きい場合は true。
  6. -ge –> int1 が int2 以上の場合は true。

For ループ

このループにより、値のリスト内の値ごとに 1 つ以上のコマンドを実行できます。その基本的な構文は次のとおりです。

for item in SEQUENCE; do 
		COMMANDS; 
done

ここで、item は、各反復中の SEQUENCE の各値を表す汎用変数です。

While ループ

このループにより、制御コマンドが終了ステータス 0 (成功) で実行される限り、一連の繰り返しコマンドを実行できます。その基本的な構文は次のとおりです。

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

ここで、EVALUATION_COMMAND は、成功 (0) または失敗 (0 以外) ステータスで終了できる任意のコマンド、および EXECUTE_COMMANDS他のネストされたループを含む、任意のプログラム、スクリプト、またはシェル構造を使用できます。

すべてを一緒に入れて

次の例では、if コンストラクトと for ループの使用法を示します。

サービスが systemd ベースのディストリビューションで実行されているかどうかを確認する

監視したいサービスのリストを一目で記載したファイルを作成しましょう。

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

シェルスクリプトは次のようになります。

#!/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 ループは、myservices.txt ファイルを一度に LIST の 1 要素ずつ読み取ります。その単一の要素は、service という名前の汎用変数によって示されます。 LIST には次の出力が入力されます。

cat myservices.txt

2). 上記のコマンドは括弧で囲まれ、その前にドル記号が付いています。これは、反復処理する LIST に値を設定するためにこのコマンドを評価する必要があることを示しています。

3). LIST の各要素 (サービス変数のすべてのインスタンスを意味します) に対して、次のコマンドが実行されます。

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

今回は、汎用変数 (LIST 内の各要素を表す) の前にドル記号を付けて、変数であることを示す必要があるため、各反復でその値を使用する必要があります。出力は grep にパイプ処理されます。

–quiet フラグは、grep が「running」という単語が表示される行を画面に表示しないようにするために使用されます。その場合、上記のコマンドは終了ステータス 0 (if 構文では $? で表されます) を返し、サービスが実行中であることを確認します。

0 以外の終了ステータス (systemctl status $service の出力に実行中の 単語 が見つからなかったことを意味します) は、サービスが実行されていないことを示します。ランニング。

さらに一歩進んで、for ループに入ろうとする前に myservices.txt の存在を確認することもできます。

#!/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
一連のネットワークまたはインターネット ホストに ping を送信して応答統計を取得する

ホストのリストをテキスト ファイルに保持し、スクリプトを使用してそれらが ping 可能かどうかを時々判断するとよいでしょう (myhosts の内容を自由に置き換えて、自分で試してみてください) )。

read シェル組み込みコマンドは、while ループに myhosts を 1 行ずつ読み取るように指示し、各行の内容を変数 host に割り当て、それが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

こちらもお読みください:

  1. シェル スクリプトを学ぶ: 初心者からシステム管理者までのガイド
  2. シェル プログラミングを学ぶための 5 つのシェル スクリプト

ファイルシステムのトラブルシューティング

Linux は非常に安定したオペレーティング システムですが、何らかの理由 (停電など) でクラッシュした場合、1 つ (または複数) のファイル システムが適切にアンマウントされないため、Linux の実行時にエラーが自動的にチェックされます。が再開される。

さらに、通常のブート中にシステムがブートするたびに、ファイルシステムをマウントする前にファイルシステムの整合性が常にチェックされます。どちらの場合も、これは fsck (「ファイル システム チェック 」) という名前のツールを使用して実行されます。

fsck はファイル システムの整合性をチェックするだけでなく、指示があれば破損したファイル システムの修復も試みます。損傷の重大度に応じて、fsck が成功するかどうかが決まります。その場合、ファイルの回復された部分は、各ファイル システムのルートにある lost+found ディレクトリに配置されます。

最後に重要なことですが、オペレーティング システムがまだ USB ドライブに書き込みを行っているときに USB ドライブを取り外そうとすると、不整合が発生する可能性があり、場合によってはハードウェアの損傷につながる可能性があることに注意する必要があります。

fsck の基本的な構文は次のとおりです。

fsck [options] filesystem
ファイルシステムのエラーをチェックし、自動的に修復を試みます

fsck でファイルシステムをチェックするには、まずそれをアンマウントする必要があります。

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

-y フラグのほかに、-a オプションを使用すると、何も質問せずにファイル システムを自動的に修復し、ファイル システムが正常に見える場合でもチェックを強制できます。

fsck -af /dev/sdg1

(当面は何も修正せずに) 何が問題なのかを調べることだけに興味がある場合は、 -n オプションを指定して fsck を実行すると、ファイルシステムの問題が標準出力に出力されます。

fsck -n /dev/sdg1

fsck の出力内のエラー メッセージに応じて、問題を自分たちで解決できるか、エンジニアリング チームにエスカレーションしてハードウェアのさらなるチェックを実行できるかがわかります。

まとめ

LFCS 試験に合格するために必要な基本的なドメイン コンピテンシーをカバーするこの 10 記事 シリーズも終わりに達しました。

明らかな理由により、これらのトピックのすべての側面を 1 つのチュートリアルでカバーすることは不可能です。そのため、これらの記事が、新しいことに挑戦し、学習を続けるための正しい軌道に乗せることを願っています。

ご質問やご意見がございましたら、いつでも大歓迎です。以下のフォームからお気軽にお問い合わせください。