はじめのLinux入門講座⑤Linuxのコマンドの使い方とシェルスクリプトについて説明します!

インフラ

今回は、Linuxのコマンドの使い方とシェルスクリプトについて説明します。

Linuxを効率的に操作するためには、コマンドの基本を理解し、シェルスクリプトを活用することが重要です。本記事では、Linuxのコマンドの使い方とシェルスクリプトの基礎について解説します。

基本的なファイル操作から、実践的なスクリプトの作成方法まで、初心者にもわかりやすく説明します。Linuxの操作を自動化し、作業を効率化するための第一歩として、参考にしてください。

ぜひ、最後までご覧いただけると嬉しいです!

Linuxの基本コマンド

Linuxはコマンドライン操作が基本となるOSであり、さまざまな作業をターミナル上で実行できます。特に基本的なコマンドを習得することで、ファイル操作やシステム管理を効率的に行えるようになります。本記事では、Linuxを使用する上で知っておきたい基本コマンドを紹介します。

0. 端末(ターミナル)の起動方法

まずは、端末(ターミナル)の起動方法について説明します。

VirtualBoxを起動して、前回インストールしたDebian Linuxを起動します。ログイン後、左上のアクティビティを選択します。

Dockの右端にある「アプリケーションを表示する」を選択します。

「端末」を選択します。

端末(ターミナル)が起動します。

以上で、端末の起動方法の説明は以上になります。

1. ディレクトリ操作

  • pwd:現在のディレクトリを表示
    例:pwd
  • ls:ディレクトリ内のファイルやフォルダを一覧表示
    例:ls -l
  • cd:ディレクトリを移動
    例:cd /home/user
  • mkdir:新しいディレクトリを作成
    例:mkdir new_folder
  • rmdir:空のディレクトリを削除
    例:rmdir old_folder

2. ファイル操作

  • touch:空のファイルを作成
    例:touch sample.txt
  • cp:ファイルをコピー
    例:cp sample.txt backup.txt
  • mv:ファイルを移動または名前変更
    例:mv sample.txt new_sample.txt
  • rm:ファイルを削除
    例:rm backup.txt

3. ファイル閲覧

  • cat:ファイルの内容を表示
    例:cat sample.txt
  • less:ページ単位でファイルを閲覧
    例:less sample.txt
    ※終了するにはqキーをおします。
  • head:ファイルの先頭部分を表示
    例:head -5 sample.txt
  • tail:ファイルの末尾部分を表示
    例:tail -5 sample.txt

4. プロセス管理

  • ps:実行中のプロセスを表示
    例:ps aux
  • top:リアルタイムでシステムの状態を監視
    例:top
    ※終了するにはqキーをおします。
  • kill:特定のプロセスを終了
    例:kill 1191

5. システム情報

  • uname -a:システム情報を表示
    例:uname -a
  • df -h:ディスクの使用状況を表示
    例:df -h
  • free -m:メモリの使用状況を表示
    例:free -m
  • uptime:システムの稼働時間を表示
    例:uptime

6. ネットワーク関連

  • ping:ネットワーク接続の確認
    例:ping google.com
    ※終了する場合、control + qキーを押します。
  • ifconfig(またはip a):ネットワークインターフェースの情報を表示
    例:ip a
  • netstat -tulnp(またはss -tulnp):開いているポートの確認
    例:ss -tulnp

まとめ

これらのコマンドは、Linuxの基本操作を行う上で欠かせないものばかりです。Linuxを扱う上で、コマンドラインの知識は必須となるため、まずは基本的なコマンドを習得し、実際にターミナルで試しながら理解を深めましょう。

シェルスクリプトの基本

1. シェルスクリプトとは?

シェルスクリプト(Shell Script)とは、複数のコマンドをまとめて実行できるスクリプトのことです。Linux では、Bash(Bourne Again Shell)が最も一般的に使用されます。

シェルスクリプトを活用することで、反復的な作業を自動化し、システム管理やバッチ処理を効率的に行うことができます。

2. シェルスクリプトの作成と実行

2.1 シェルスクリプトの基本構造

シェルスクリプトは .sh の拡張子をつけたファイルとして作成します。

#!/bin/bash
# これはサンプルのシェルスクリプトです

echo "Hello, Linux!"
  • #!/bin/bash は「シバン(shebang)」と呼ばれ、このスクリプトが Bash で実行されることを示します。
  • echo コマンドは、指定した文字列を出力します。

2.2 スクリプトの実行方法

作成したスクリプトに実行権限を与え、実行します。

chmod +x script.sh
./script.sh

または、bash を指定して実行することも可能です。

bash script.sh

3. 変数と引数

3.1 変数の宣言と使用

#!/bin/bash
name="Taro"
echo "Hello, $name!"
  • 変数 name"Taro" を代入し、$name で値を参照します。
  • 変数を使用する際は "$変数名" の形式で記述します。

3.2 コマンドライン引数

スクリプト実行時に引数を渡すことができます。引数とは、スクリプトを実行するときに追加できる値のことで、$1$2 などの番号付きの変数を使って受け取ることができます。

#!/bin/bash
echo "引数1: $1"
echo "引数2: $2"

<実行例>

./script.sh Linux Shell

<出力>

引数1: Linux
引数2: Shell

4. 条件分岐とループ

4.1 条件分岐(if 文)

if文は、指定した条件が真かどうかを判定し、真の場合に特定の処理を実行する構文です。

if 条件式; then
    コマンド1
    コマンド2
fi

上記のように書き、elseelifを使って分岐もできます。

#!/bin/bash
if [ $# -eq 0 ]; then
    echo "引数がありません"
else
    echo "引数: $1"
fi

<コード説明>

  1. [ $# -eq 0 ] は、「引数の数が 0 である」という条件を表します。
  2. then 以降の処理が条件に応じて実行されます。

4.2 ループ処理(for 文、while 文)

for文

for 文は、指定した範囲やリスト内の要素を順番に処理するループ構文です。繰り返し回数が明確な場合に適しています。

for i in {1..5}; 
do echo "ループ: $i" done

<コード説明>

  1. {1..5}1 から 5 までの範囲を指定し、変数 i に1つずつ代入します。
  2. do 以降の処理が、範囲の値ごとに実行されます。
  3. echo "ループ: $i" により、i の値を含むメッセージが出力されます。
  4. ループが 5 回繰り返され、ループ: 1ループ: 5 まで順番に出力されます。
while文

while 文は、指定した条件が満たされている間、繰り返し処理を実行するループ構文です。条件が変わるまでループが続くため、繰り返し回数が不明な場合に適しています。

count=1 while [ $count -le 3 ];
do echo "カウント: $count" count=$((count + 1)) done

<コードの説明>

  1. 変数 count1 に初期化します。
  2. while [ $count -le 3 ] の条件が true の間、ループを実行します。
  3. echo "カウント: $count"count の値を出力します。
  4. count=$((count + 1)) により、count1 ずつ増加させます。
  5. count4 になると条件 count -le 3false となり、ループが終了します。
  6. 実行結果として カウント: 1カウント: 3 が順番に出力されます。

このように、for 文は回数が決まっているループ、while 文は条件が満たされるまでのループ処理に適しています。

5. 関数の定義

関数は、一連のコマンドをまとめて定義し、再利用可能な形にするための仕組みです。関数を使用することで、スクリプトの可読性や保守性を向上させることができます。

greet() {
    echo "こんにちは、$1 さん!"
}

greet "太郎"
greet "花子"

<コードの説明>

  1. greet() という関数を定義。
  2. echo "こんにちは、$1 さん!" により、引数 $1 を含むメッセージを出力。
    • $1 は関数に渡された最初の引数を表します。
  3. greet "太郎" を実行すると、$1"太郎" が渡され、こんにちは、太郎 さん! と出力されます。
  4. greet "花子" を実行すると、$1"花子" が渡され、こんにちは、花子 さん! と出力されます。

このように、関数を使うことで、同じ処理を簡潔に記述し、可読性を向上させることができます。

6. シェルスクリプトの実践例

6.1 バックアップスクリプトの例

このシェルスクリプトは、ユーザーの documents ディレクトリを /backup にバックアップする処理を行います。ファイルのコピーには rsync を使用し、効率的なバックアップを実現します。rsync は、ファイルの差分を比較して変更された部分のみを転送する、高速かつ効率的なファイル同期ツールです。

#!/bin/bash
backup_dir="/backup"
mkdir -p $backup_dir
rsync -av --delete /home/user/documents/ $backup_dir/
echo "バックアップ完了"
6.1 バックアップスクリプトの説明

1. シェバン(#!/bin/bash

  • スクリプトのインタープリタとして bash を指定します。

2. バックアップ先ディレクトリの指定

backup_dir="/backup"

変数 backup_dir にバックアップ先のディレクトリ /backup を設定します。

3. バックアップディレクトリの作成

mkdir -p $backup_dir
  • mkdir -p を使用して、$backup_dir (/backup) を作成します。
  • -p オプションにより、ディレクトリが存在しない場合は作成され、既に存在していてもエラーになりません。

4. ファイルのコピー(バックアップ処理)

rsync -av --delete /home/user/documents/ $backup_dir/
  • rsync を使用して documents ディレクトリの内容を /backup にバックアップします。
  • -a(アーカイブ)オプションにより、ファイルの所有者・パーミッション・タイムスタンプを保持したままコピーします。
  • -v(verbose)オプションにより、処理の詳細を表示します。
  • --delete オプションを付けることで、バックアップ元から削除されたファイルはバックアップ先でも削除され、同期を維持します。
  • documents/ の末尾の / は、ディレクトリの中身のみをコピーするために必要です。

5. バックアップ完了メッセージの表示

echo "バックアップ完了"
  • バックアップ処理が完了したことを示すメッセージ "バックアップ完了" を出力します。

6.2 ログ監視スクリプトの例

ログ監視は、システムやアプリケーションの異常を検出し、迅速な対応を行うために重要です。ここでは、特定のログファイルを監視し、エラーが発生した際に通知を行うシェルスクリプトを作成します。

#!/bin/bash

log_file="/var/log/syslog"
error_pattern="ERROR"
log_backup="/var/log/syslog_backup"

# ログのバックアップを作成
cp $log_file $log_backup

# ログの最新行を監視
tail -F $log_file | while read line
do
    if echo "$line" | grep -q "$error_pattern"; then
        echo "【警告】ログにエラーが検出されました: $line"
    fi
done
6.2 ログ監視スクリプトの説明

1.シェバン(#!/bin/bash

  • スクリプトのインタープリタとして bash を指定します。

2.変数の定義

log_file="/var/log/syslog"
error_pattern="ERROR"
log_backup="/var/log/syslog_backup"
  • log_file:監視するログファイル(例:/var/log/syslog)。
  • error_pattern:検出するエラーパターン(例:ERROR という文字列を含む行を検出)。
  • log_backup:ログのバックアップを保存するファイル。

3.ログのバックアップを作成

cp $log_file $log_backup
  • cp コマンドを使用して、現在のログファイルをバックアップとして保存します。

4.tail -F を使用してリアルタイム監視

tail -F $log_file | while read line
  • tail -F コマンドは、ログファイルの末尾を監視し、新しい行が追加されるたびにリアルタイムで取得します。
  • | while read line により、新しく追加された行を line 変数に格納し、ループ処理を行います。

5. エラーパターンの検出

do
if echo "$line" | grep -q "$error_pattern"; then
echo "【警告】ログにエラーが検出されました: $line"
fi
done
  • do は、whilefor ループなどの繰り返し処理の中で実行されるコードブロックの開始を示します。
  • if ... thenは条件分岐を行い、$line 内に $error_pattern が含まれていれば、then 以下の処理を実行します。
  • grep -q "$error_pattern" を使用し、取得した行に ERROR の文字列が含まれるかをチェックします。
  • 該当する行が見つかった場合、echo コマンドで警告メッセージを出力します。
  • do に対応する whilefor の処理が完了すると、done でループが終了します。

7. まとめ

シェルスクリプトを活用することで、システム管理や定型作業を自動化できます。基本のコマンドや制御構造を理解し、効率的なスクリプト作成を目指しましょう。

シェルスクリプトの応用

基本的なシェルスクリプトを理解したら、より高度なスクリプトを作成することで、効率的なシステム管理や自動化が可能になります。本記事では、シェルスクリプトの応用として、環境変数の活用、エラーハンドリング、並列処理、外部コマンドの活用などについて解説します。

1. 環境変数と設定ファイルの活用

1.1 環境変数の利用

環境変数はシェルスクリプト内で外部の設定情報を参照する際に利用されます。下記シェルスクリプトは、実行したユーザーの基本的な情報を表示するものです。

#!/bin/bash
echo "ユーザー名: $USER"
echo "ホームディレクトリ: $HOME"
echo "現在のディレクトリ: $PWD"
コードの説明
#!/bin/bash
  • スクリプトがBashシェルで実行されることを指定します。
echo "ユーザー名: $USER"
  • 環境変数$USERを使って、現在のユーザー名を表示します。
echo "ホームディレクトリ: $HOME"
  • $HOMEを使い、そのユーザーのホームディレクトリのパスを表示します。
echo "現在のディレクトリ: $PWD"
  • $PWDを使って、スクリプトを実行した際の作業ディレクトリ(カレントディレクトリ)を表示します。
実行結果の例

上記コマンドを実行した際の実行結果の例は以下になります。

ユーザー名: hajime
ホームディレクトリ: /home/hajime  
現在のディレクトリ: /home/hajime/ドキュメント

1.2 設定ファイルの読み込み

設定ファイルを利用することで、スクリプトの柔軟性を高められます。下記シェルスクリプトは、設定ファイル /etc/myconfig.conf から変数を読み込み、その値を表示するものです。

#!/bin/bash
source /etc/myconfig.conf
echo "設定された値: $CONFIG_VALUE"
コードの説明
#!/bin/bash
  • スクリプトが Bash シェルで実行されることを指定します。
source /etc/myconfig.conf
  • source コマンド(または . コマンド)を使って /etc/myconfig.conf の内容を現在のスクリプトに読み込みます。
  • これにより、設定ファイル内で定義された変数がスクリプト内で使用できるようになります。
echo "設定された値: $CONFIG_VALUE"
  • 変数 $CONFIG_VALUE に設定ファイル内の値が格納されていると仮定し、それを画面に表示します。
実行結果の例

上記コマンドを実行した際の結果は、/etc/myconfig.conf の内容によって異なります。

例えば、/etc/myconfig.conf に以下のような設定がある場合は、

CONFIG_VALUE="example_value"

スクリプトの出力は次のようになります。

設定された値: example_value

CONFIG_VALUE/etc/myconfig.conf に定義されていない場合、出力は 設定された値: (空白)となる可能性があります。

2. エラーハンドリングとデバッグ

2.1 エラー処理(trapコマンド)

エラー発生時に特定の処理を実行するには trap を使用します。

#!/bin/bash
trap 'echo "エラーが発生しました"; exit 1' ERR
ls /nonexistent_directory
コードの説明
#!/bin/bash
  • スクリプトが Bash シェルで実行されることを指定します。
trap 'echo "エラーが発生しました"; exit 1' ERR
  • trap コマンドを使用し、ERR シグナル(エラー発生時)をキャッチします。
  • ERR が発生した場合、echo "エラーが発生しました" というメッセージを出力し、exit 1 でスクリプトを終了します。
ls /nonexistent_directory
  • 存在しないディレクトリ /nonexistent_directory の内容を ls コマンドで表示しようとします。
  • このディレクトリは存在しないため、ls コマンドはエラーを出します。
  • trap によって ERR がキャッチされ、エラーメッセージが表示されてスクリプトが終了します。
実行結果の例

上記コマンドを実行した際の実行結果の例は以下になります。

ls: cannot access '/nonexistent_directory': No such file or directory
エラーが発生しました

このスクリプトは、エラー発生時に適切なメッセージを表示し、スクリプトの異常終了を明示的に行うように設計されています。

2.2 デバッグモード(setコマンド)

スクリプトの実行過程を詳細に確認するには set -x を使用します。

#!/bin/bash
set -x
echo "デバッグモードで実行"
set +x
echo "デバッグ終了"

コードの説明

#!/bin/bash
  • スクリプトが Bash シェルで実行されることを指定します。
set -x
  • デバッグモードの有効化 (-x)
  • set -x を実行すると、以降のコマンドが 実行前に展開された形で表示 されます。
  • スクリプトの動作を詳細に確認する際に役立ちます。
echo "デバッグモードで実行"
  • echo コマンドで "デバッグモードで実行" というメッセージを出力します。
  • set -x により、実際に echo コマンドがどのように展開されるかが表示されます。
set +x
  • デバッグモードの無効化 (+x)
  • これ以降のコマンドはデバッグ出力されなくなります。
echo "デバッグ終了"
  • "デバッグ終了" というメッセージを出力します。
  • set +x により、この行はデバッグモードの出力対象になりません。

実行結果の例

スクリプトを実行すると、以下のような出力になります。

+ echo 'デバッグモードで実行'
デバッグモードで実行
+ set +x
デバッグ終了
  • + echo 'デバッグモードで実行'echo コマンドが実行される前に展開された形で表示されます。
  • set +x の後は通常の出力 (デバッグ終了) のみが表示され、デバッグ情報は出力されません。

3. 並列処理とバックグラウンド実行

3.1 & を使用した並列実行

以下の例では、複数のコマンドを並行して実行します。下記シェルスクリプトは、バックグラウンドで並行して実行される処理を wait コマンドで待機し、すべての処理が完了した後にメッセージを表示するものです。

#!/bin/bash
echo "タスク1実行中..." &
echo "タスク2実行中..." &
wait
echo "すべてのタスクが完了しました"
コードの説明
!/bin/bash
  • スクリプトが Bash シェルで実行されることを指定します。
echo "タスク1実行中..." &
  • echo コマンドで「タスク1実行中…」と表示します。
  • & を付けることで、このコマンドをバックグラウンドジョブとして実行し、次の処理を待たずに進みます。
echo "タスク2実行中..." &
  • 「タスク2実行中…」を表示し、同様にバックグラウンドジョブとして実行します。
wait
  • すべてのバックグラウンドジョブが終了するまでスクリプトの実行を待機します。
echo "すべてのタスクが完了しました"
  • wait によりバックグラウンドジョブの終了を確認した後、「すべてのタスクが完了しました」と表示します。
実行結果の例

このシェルスクリプトを実行すると、バックグラウンドで実行される echo コマンドの順番が環境によって異なる場合がありますが、一般的な実行結果の例は以下のようになります。

タスク1実行中...  
タスク2実行中...  
すべてのタスクが完了しました

タスク1実行中...タスク2実行中... の順番は前後する可能性がありますが、wait によりバックグラウンドジョブの完了を待つため、最後に "すべてのタスクが完了しました" が必ず表示されます。

3.2 xargs による並列処理

ファイルリストを並列で処理する例です。下記シェルスクリプトは、カレントディレクトリ内のすべての .txt ファイルを並列で圧縮する処理を行います。

ls *.txt | xargs -n 1 -P 4 gzip
コードの説明
ls *.txt
  • カレントディレクトリ内の .txt ファイルの一覧を取得します。
| xargs -n 1 -P 4 gzip
  • xargs コマンドを使用し、取得したファイル名を gzip コマンドに渡して圧縮します。
  • -n 1 は、gzip に対して 1 つのファイルずつ渡すオプションです。
  • -P 4 は、最大 4 つのプロセスを並行して実行するオプションで、4 つのファイルを同時に圧縮できます。
実行結果の例

このシェルスクリプトを実行すると、カレントディレクトリ内の .txt ファイルを gzip で圧縮します。

例えば、実行前に以下の .txt ファイルが存在するとします。

file1.txt
file2.txt
file3.txt
file4.txt
file5.txt

このコマンドを実行すると、xargs -P 4 により最大 4 つの gzip プロセスが並列で実行され、.txt ファイルが .gz に圧縮されます。

<実行結果の例(並列処理のため順番は異なる可能性あり)>

file1.txt を圧縮中...
file2.txt を圧縮中...
file3.txt を圧縮中...
file4.txt を圧縮中...
file5.txt を圧縮中...

圧縮後、ディレクトリの内容は以下のようになります。

file1.txt.gz
file2.txt.gz
file3.txt.gz
file4.txt.gz
file5.txt.gz

※実際の出力には gzip の詳細なメッセージは表示されませんが、並列処理の影響でファイルの圧縮順序は異なる可能性があります。

4. 外部コマンドとAPI連携

4.1 curl を用いたAPIリクエスト

Web API と連携し、データを取得できます。下記シェルスクリプトは、curl コマンドを使用して外部APIからデータを取得し、そのレスポンスを表示するものです。

#!/bin/bash
response=$(curl -s https://api.example.com/data)
echo "APIレスポンス: $response"
コードの説明
#!/bin/bash
  • スクリプトが Bash シェルで実行されることを指定します。
response=$(curl -s https://api.example.com/data)
  • curl コマンドを使用して https://api.example.com/data からデータを取得します。
  • -s--silent)オプションは、進捗情報やエラーメッセージを非表示にし、レスポンスデータのみを取得するためのものです。
  • $(...) により、curl の出力を response 変数に格納します。
echo "APIレスポンス: $response"
  • 取得したデータを response 変数から出力します。
実行結果の例

このシェルスクリプトを実行すると、curl コマンドを使用して https://api.example.com/data からデータを取得し、変数 response に格納した後、その内容を echo で表示します。

<実行結果の例>

APIレスポンス: {"status":"success","data":{"id":123,"name":"example"}}

また、API がエラーを返した場合は、次のような出力になる可能性があります。

APIレスポンス: {"error":"Not Found"}

※実際の出力は https://api.example.com/data のレスポンスによって異なります。
-s オプションにより、curl の進行状況メッセージは表示されません。

4.2 jq によるJSON処理

APIレスポンスのJSONデータを解析するには jq を利用します。下記シェルスクリプトは、jq コマンドを使用してJSONデータを解析し、特定の値を抽出する処理を行います。

#!/bin/bash
json='{"name": "Linux", "version": "5.10"}'
echo $json | jq '.name'
コードの説明
#!/bin/bash
  • スクリプトが Bash シェルで実行されることを指定します。
json='{"name": "Linux", "version": "5.10"}'
  • 変数 json に、nameversion を含むJSONデータを格納します。
echo $json | jq '.name'
  • echo $json でJSONデータを標準出力に送信します。
  • | jq '.name' により、JSONから name の値(”Linux”)を抽出し、出力します。
実行結果の例

このシェルスクリプトを実行すると、jq コマンドを使用して JSON データから "name" の値を抽出します。

<実行結果の例>

"Linux"

jq の出力では、JSON 形式を保持するために値が "(ダブルクォート) で囲まれます。
jq コマンドがインストールされていない場合は、エラーが発生する可能性があります(例: command not found: jq)。

5. 高度なファイル処理

5.1 監視スクリプト

特定のディレクトリ内の変更を監視し、ログに記録します。下記このシェルスクリプトは、inotifywait コマンドを使用して /var/log ディレクトリ内のファイル変更を監視し、変更があった場合にログを /var/log/monitor.log に記録する処理を行います。

#!/bin/bash
inotifywait -m /var/log -e modify -e create -e delete --format '%w%f %e' |
while read file event; do
echo "$file に $event が発生しました" >> /var/log/monitor.log
done
コードの説明
#!/bin/bash
  • スクリプトが Bash シェルで実行されることを指定します。
inotifywait -m /var/log -e modify -e create -e delete --format '%w%f %e' |
  • inotifywait を使用して /var/log ディレクトリの変更を監視します。inotifywait コマンドは、Linux の inotify 機能を利用してファイルやディレクトリの変更を監視し、指定したイベント(作成、変更、削除など)が発生した際にリアルタイムで通知を行うツールです。
  • -m (monitor) オプションを指定することで、継続的に監視を行います。
  • -e modify -e create -e delete で、ファイルの変更 (modify)、作成 (create)、削除 (delete) を監視対象にします。
  • --format '%w%f %e' で、イベントが発生したファイル (%w%f) とイベントの種類 (%e) を取得します。
  • | (パイプ) を使用して、出力を while read ループへ渡します。
while read file event; do
  • inotifywait の出力(ファイル名とイベント名)を fileevent という変数に格納し、ループ処理を行います。
echo "$file に $event が発生しました" >> /var/log/monitor.log
  • 監視したイベントの情報を /var/log/monitor.log に記録します。
  • 出力例:/var/log/syslog に MODIFY が発生しました
done
  • while ループの終了を示します。
実行結果の例

このシェルスクリプトを実行すると、/var/log ディレクトリ内のファイルに対して、以下のイベントを監視し、変更があった場合に /var/log/monitor.log に記録します。

【監視するイベント】

  • modify(ファイルの変更)
  • create(ファイルの作成)
  • delete(ファイルの削除)

<実行結果の例 (/var/log/monitor.log の内容)>

例えば、次のような操作が行われた場合は以下になります。

  1. /var/log/example.log が作成される
  2. /var/log/example.log が変更される
  3. /var/log/example.log が削除される

/var/log/monitor.log に記録される内容は次のようになります。

/var/log/example.log CREATE に発生しました
/var/log/example.log MODIFY に発生しました
/var/log/example.log DELETE に発生しました

【注意点】

  • inotifywait がインストールされていない環境ではエラーになります (command not found: inotifywait)。
  • inotifywait-m オプション(monitor モード)により、スクリプトは継続的に監視を続けます。
  • /var/log/monitor.log に書き込みを行うため、スクリプトの実行には適切な権限が必要です(例: sudo が必要な場合がある)。

5.2 大量のファイルを一括処理

ファイルを一定数ごとに処理する例です。下記シェルスクリプトは、find コマンドと xargs を組み合わせて、指定ディレクトリ内のファイルを /backup/ ディレクトリへ並列コピーする処理を行います。

#!/bin/bash
find /path/to/files -type f | xargs -n 10 -P 4 cp -t /backup/
コードの説明
#!/bin/bash
  • スクリプトが Bash シェルで実行されることを指定します。
json='{"name": "Linux", "version": "5.10"}'
  • 変数 json に、nameversion を含むJSONデータを格納します。
echo $json | jq '.name'
  • echo $json でJSONデータを標準出力に送信します。
  • | jq '.name' により、JSONから name の値(”Linux”)を抽出し、出力します。
実行結果の例

このシェルスクリプトを実行すると、/path/to/files 内のすべてのファイルを /backup/ にコピーします。

<実行の流れ>

  1. find /path/to/files -type f/path/to/files 内のファイル一覧を取得
  2. xargs -n 10 -P 4 cp -t /backup/ で、最大 10 ファイルずつ 4 並列プロセスでコピー

<実行結果の例>

・前提となるディレクトリ構造

/path/to/files/
├── file1.txt
├── file2.txt
├── file3.txt
├── file4.txt
├── file5.txt
├── file6.txt
├── file7.txt
├── file8.txt
├── file9.txt
├── file10.txt
├── file11.txt
└── file12.txt

・コピー実行後の /backup/ の内容

/backup/
├── file1.txt
├── file2.txt
├── file3.txt
├── file4.txt
├── file5.txt
├── file6.txt
├── file7.txt
├── file8.txt
├── file9.txt
├── file10.txt
├── file11.txt
└── file12.txt

<出力(標準出力には特に何も表示されないが、-v を付けると詳細が見える)>

通常は出力なし。
cp -v を使った場合>

'/path/to/files/file1.txt' -> '/backup/file1.txt'
'/path/to/files/file2.txt' -> '/backup/file2.txt'
...
'/path/to/files/file12.txt' -> '/backup/file12.txt'

ポイント

  • -P 4 により 4 並列で処理されるため、大量のファイルを高速にコピー可能。
  • -n 10 により、10 ファイルずつ cp に渡される。
  • /backup/ フォルダが存在しない場合、エラーになるため事前に作成しておく必要がある。
  • xargs の並列処理のため、ファイルのコピー順は一定ではない。

7. シェルスクリプトの応用のまとめ

本記事では、シェルスクリプトの応用として、環境変数の利用、エラーハンドリング、並列処理、外部コマンドの活用などを紹介しました。これらの技術を活用することで、より高度なスクリプトを作成し、システム管理の効率化を図ることができます。

まとめ

今回は、下記3点について説明しました。

  1. Linuxの基本コマンド
  2. シェルスクリプトの基本
  3. シェルスクリプトの応用

今回は、Linuxの基本コマンドとシェルスクリプトについて説明しました。GUI環境のLinuxではコマンドを使わずに操作できますが、ビジネスで利用されるLinuxの多くはCUI環境です。本記事を参考に基本コマンドを習得し、効率的な操作を身につけましょう。また、シェルスクリプトを活用すれば、タスクの自動化が可能です。日々のバックアップや監視業務の負担を軽減するためにも、シェルスクリプトの活用をぜひ学んでください。

これからも、Macのシステムエンジニアとして、日々、習得した知識や経験を発信していきますので、是非、ブックマーク登録してくれると嬉しいです!

それでは、次回のブログで!

タイトルとURLをコピーしました