Linux 条件テスト

LinuxBeginner

はじめに

この実験では、Linux の条件テストを使用してシステムのチェックと検証を自動化する方法を学びます。Linux は強力な test コマンドを提供しており、これを使用すると条件を評価し、その結果に基づいてアクションを実行することができます。このコマンドの使い方を理解することは、判断を行い、さまざまな条件に応答できるシェルスクリプトを作成するために不可欠です。

この実験を通じて、test コマンドのさまざまな側面、ファイルテスト、文字列比較、数値評価などを扱います。このセッションの終了時には、システムの自動チェックを実行し、その整合性を維持するのに役立つスクリプトを作成できるようになります。

test コマンドの基本を理解する

Linux の test コマンドは、シェルスクリプトで条件を評価するための重要なツールです。このコマンドを使うと、ファイルの属性をチェックしたり、文字列の比較や数値の評価などを行うことができます。テスト対象の条件が真の場合、test は終了ステータスとして 0 を返し、それ以外の場合は非 0 の終了ステータスを返します。

まずは基本から始めましょう。まず、プロジェクトディレクトリに移動します。

cd ~/project

test コマンドは 2 つの方法で記述することができます。

  1. test という単語の後に条件を記述する
  2. 条件を角括弧 [ ] で囲む

ディレクトリが存在するかどうかをチェックするために、両方の方法を試してみましょう。

## 方法 1: 'test' という単語を使用する
test -d ~/project && echo "The project directory exists."

## 方法 2: 角括弧を使用する
[ -d ~/project ] && echo "The project directory exists."

これらの両方のコマンドで、以下の出力が表示されるはずです。

The project directory exists.

-d オプションは、ディレクトリが存在するかどうかをチェックします。&& 演算子は、テスト条件が真の場合にのみ echo コマンドを実行するために使用されます。

一般的なファイルテストオプションには以下のようなものがあります。

  • -d file: ファイルが存在し、ディレクトリである場合に真
  • -e file: ファイルが存在する場合に真
  • -f file: ファイルが存在し、通常のファイルである場合に真
  • -r file: ファイルが存在し、読み取り可能である場合に真
  • -w file: ファイルが存在し、書き込み可能である場合に真
  • -x file: ファイルが存在し、実行可能である場合に真
  • -s file: ファイルが存在し、サイズが 0 より大きい場合に真

テストファイルを作成し、その属性をチェックしてみましょう。

## テストファイルを作成する
echo "Hello, Linux condition testing!" > test_file.txt

## ファイルが存在するかどうかをチェックする
test -e test_file.txt && echo "The file exists."

## ファイルが読み取り可能かどうかをチェックする
[ -r test_file.txt ] && echo "The file is readable."

## ファイルが空でないかどうかをチェックする
[ -s test_file.txt ] && echo "The file is not empty."

これらのコマンドは、以下の出力を生成するはずです。

The file exists.
The file is readable.
The file is not empty.

次に、test コマンドを使用してファイルが存在するかどうかをチェックし、存在しない場合は作成する簡単なシェルスクリプトを作成しましょう。

## スクリプトファイルを作成する
cat > check_file.sh << 'EOF'
#!/bin/bash

FILENAME="status.txt"

if [ ! -e "$FILENAME" ]; then
  echo "File $FILENAME does not exist. Creating it now."
  echo "This is a status file." > "$FILENAME"
else
  echo "File $FILENAME already exists."
fi

## ファイルの内容を表示する
echo "Content of $FILENAME:"
cat "$FILENAME"
EOF

## スクリプトを実行可能にする
chmod +x check_file.sh

## スクリプトを実行する
./check_file.sh

スクリプトを実行すると、以下のような出力が表示されるはずです。

File status.txt does not exist. Creating it now.
Content of status.txt:
This is a status file.

再度スクリプトを実行すると、以下のように表示されます。

File status.txt already exists.
Content of status.txt:
This is a status file.

これは、test コマンドを使用してファイルの存在をチェックし、結果に基づいて異なるアクションを実行する方法を示しています。

文字列条件のテスト

このステップでは、test コマンドを使用して文字列を比較する方法を学びます。これは、ユーザー入力の検証、環境変数のチェック、またはテキスト内容に基づいて判断を行う必要がある場合に役立ちます。

一般的な文字列比較演算子には以下のようなものがあります。

  • ==: 等しい
  • !=: 等しくない
  • -z: 文字列が空の場合に真
  • -n: 文字列が空でない場合に真

まずは、さまざまな文字列条件をテストしてみましょう。

## 2 つの文字列が等しいかどうかをテストする
str1="linux"
str2="linux"
[ "$str1" == "$str2" ] && echo "The strings are equal."

## 2 つの文字列が異なるかどうかをテストする
str3="ubuntu"
[ "$str1" != "$str3" ] && echo "The strings are different."

## 文字列が空かどうかをテストする
empty_str=""
[ -z "$empty_str" ] && echo "The string is empty."

## 文字列が空でないかどうかをテストする
[ -n "$str1" ] && echo "The string is not empty."

出力は以下のようになるはずです。

The strings are equal.
The strings are different.
The string is empty.
The string is not empty.

次に、パスワードを要求し、特定の条件を満たしているかどうかをチェックするスクリプトを作成しましょう。

## パスワード検証スクリプトを作成する
cat > password_check.sh << 'EOF'
#!/bin/bash

echo "Enter a password:"
read -s password

## パスワードが空かどうかをチェックする
if [ -z "$password" ]; then
  echo "Error: Password cannot be empty."
  exit 1
fi

## パスワードの長さをチェックする
if [ ${#password} -lt 8 ]; then
  echo "Error: Password must be at least 8 characters long."
  exit 1
fi

## パスワードに "password" という単語が含まれているかどうかをチェックする
if [[ "$password" == *password* ]]; then
  echo "Error: Password cannot contain the word 'password'."
  exit 1
fi

echo "Password is valid!"
EOF

## スクリプトを実行可能にする
chmod +x password_check.sh

## スクリプトを実行する
echo "You can test the script by running: ./password_check.sh"

異なるパスワードでスクリプトを実行し、入力の検証方法を確認してみましょう。

## 短いパスワードでテストする
echo "short" | ./password_check.sh

## "password" を含むパスワードでテストする
echo "mypassword123" | ./password_check.sh

## 有効なパスワードでテストする
echo "SecurePass123" | ./password_check.sh

最初の 2 つのテストは失敗し、3 番目のテストは成功するはずです。

次に、テキスト入力に基づいてシステムの状態を処理する別のスクリプトを作成しましょう。

## システム状態スクリプトを作成する
cat > system_status.sh << 'EOF'
#!/bin/bash

echo "Enter system status (normal, warning, critical):"
read status

if [ -z "$status" ]; then
  echo "No status provided. Assuming normal operation."
  status="normal"
fi

case "$status" in
  "normal")
    echo "System is operating normally. No action required."
    ;;
  "warning")
    echo "Warning: System requires attention. Check log files."
    ;;
  "critical")
    echo "CRITICAL: Immediate action required! System stability at risk."
    ;;
  *)
    echo "Unknown status: $status. Please use normal, warning, or critical."
    ;;
esac
EOF

## スクリプトを実行可能にする
chmod +x system_status.sh

## スクリプトを実行する
echo "You can test the script by running: ./system_status.sh"

異なる状態の入力でスクリプトを実行してみましょう。

## "normal" 状態でテストする
echo "normal" | ./system_status.sh

## "warning" 状態でテストする
echo "warning" | ./system_status.sh

## "critical" 状態でテストする
echo "critical" | ./system_status.sh

## 無効な状態でテストする
echo "unstable" | ./system_status.sh

## 空の入力でテストする
echo "" | ./system_status.sh

各入力は、スクリプト内の条件ロジックに基づいて異なる出力を生成するはずです。

数値条件のテスト

このステップでは、test コマンドを使用して数値を比較する方法を学びます。これは、リソースの使用状況をチェックしたり、ユーザー入力を検証したり、数値に基づいて判断を行ったりする際に役立ちます。

一般的な数値比較演算子には以下のようなものがあります。

  • -eq: 等しい
  • -ne: 等しくない
  • -lt: より小さい
  • -le: 以下
  • -gt: より大きい
  • -ge: 以上

まずは、基本的な数値比較を試してみましょう。

## 2 つの数値を比較する
num1=10
num2=20

## 等しい
[ $num1 -eq 10 ] && echo "$num1 is equal to 10"

## 等しくない
[ $num1 -ne $num2 ] && echo "$num1 is not equal to $num2"

## より小さい
[ $num1 -lt $num2 ] && echo "$num1 is less than $num2"

## より大きい
[ $num2 -gt $num1 ] && echo "$num2 is greater than $num1"

## 以下
[ $num1 -le 10 ] && echo "$num1 is less than or equal to 10"

## 以上
[ $num2 -ge 20 ] && echo "$num2 is greater than or equal to 20"

出力は以下のようになるはずです。

10 is equal to 10
10 is not equal to 20
10 is less than 20
20 is greater than 10
10 is less than or equal to 10
20 is greater than or equal to 20

次に、ディスク容量をチェックし、一定の閾値を下回った場合に警告を表示するスクリプトを作成しましょう。

## ディスク容量チェックスクリプトを作成する
cat > disk_check.sh << 'EOF'
#!/bin/bash

## ディスク使用率を取得する(% 記号を削除する)
DISK_USAGE=$(df -h / | grep / | awk '{print $5}' | sed 's/%//')

## 閾値を設定する
WARNING_THRESHOLD=70
CRITICAL_THRESHOLD=90

echo "Current disk usage: $DISK_USAGE%"

if [ $DISK_USAGE -ge $CRITICAL_THRESHOLD ]; then
  echo "CRITICAL: Disk usage is critically high!"
  echo "Action: Clean up unnecessary files immediately."
elif [ $DISK_USAGE -ge $WARNING_THRESHOLD ]; then
  echo "WARNING: Disk usage is getting high."
  echo "Action: Consider cleaning up some files soon."
else
  echo "OK: Disk usage is normal."
  echo "No action required."
fi
EOF

## スクリプトを実行可能にする
chmod +x disk_check.sh

## スクリプトを実行する
./disk_check.sh

このスクリプトは、現在のディスク使用率を表示し、ディスクの満杯具合に応じて異なるメッセージを出力します。

次に、温度監視システムをシミュレートする別のスクリプトを作成しましょう。

## 温度監視スクリプトを作成する
cat > temp_monitor.sh << 'EOF'
#!/bin/bash

## 15 から 35 の間のランダムな温度を生成する関数
generate_temp() {
  echo $((RANDOM % 21 + 15))
}

## ランダムな温度を生成する
TEMP=$(generate_temp)
echo "Current temperature: ${TEMP}°C"

## 温度の閾値
MIN_TEMP=18
MAX_TEMP=26

if [ $TEMP -lt $MIN_TEMP ]; then
  echo "Action: Increase heating. Temperature is below minimum threshold."
elif [ $TEMP -gt $MAX_TEMP ]; then
  echo "Action: Activate cooling. Temperature is above maximum threshold."
else
  echo "Status: Temperature is within acceptable range."
fi

## 極端な温度の追加チェック
if [ $TEMP -ge 30 ]; then
  echo "WARNING: Temperature is very high. Check cooling systems."
fi
if [ $TEMP -le 17 ]; then
  echo "WARNING: Temperature is very low. Check heating systems."
fi
EOF

## スクリプトを実行可能にする
chmod +x temp_monitor.sh

## スクリプトを実行する
./temp_monitor.sh

このスクリプトを実行するたびに、ランダムな温度が生成され、それに応じた応答が表示されます。何度か実行して、異なる結果を確認してみましょう。

## 温度監視スクリプトを複数回実行する
./temp_monitor.sh
./temp_monitor.sh
./temp_monitor.sh

これらの例は、数値条件を使用してシステムパラメータを監視し、閾値に基づいて適切なアクションを実行する方法を示しています。

論理演算子で条件を組み合わせる

このステップでは、論理演算子を使用して複数の条件を組み合わせる方法を学びます。これは、スクリプト内で複雑な判断ロジックを作成するために不可欠です。

主な 3 つの論理演算子は以下の通りです。

  • && (AND): 両方の条件が真の場合に真
  • || (OR): 少なくとも 1 つの条件が真の場合に真
  • ! (NOT): 条件が偽の場合に真

まずは、基本的な例を見てみましょう。

## テスト用のファイルを作成する
touch test_file.txt
chmod 644 test_file.txt

## AND 演算子 - 両方の条件が真でなければならない
[ -f test_file.txt ] && [ -r test_file.txt ] && echo "The file exists and is readable."

## OR 演算子 - 少なくとも 1 つの条件が真であればよい
[ -x test_file.txt ] || [ -w test_file.txt ] && echo "The file is either executable or writable."

## NOT 演算子 - 条件を反転する
[ ! -x test_file.txt ] && echo "The file is not executable."

## 複数の演算子を組み合わせる
[ -f test_file.txt ] && [ -r test_file.txt ] && [ ! -x test_file.txt ] && echo "The file exists, is readable, but is not executable."

以下のような出力が表示されるはずです。

The file exists and is readable.
The file is either executable or writable.
The file is not executable.
The file exists, is readable, but is not executable.

test コマンドでは、以下の演算子を使用して単一の括弧内で条件を組み合わせることもできます。

  • -a (AND)
  • -o (OR)

例えば:

## 単一の test コマンド内での AND
[ -f test_file.txt -a -r test_file.txt ] && echo "The file exists and is readable."

## 単一の test コマンド内での OR
[ -x test_file.txt -o -w test_file.txt ] && echo "The file is either executable or writable."

次に、システムリソースをチェックするより複雑なスクリプトを作成しましょう。

## システムリソースチェックスクリプトを作成する
cat > resource_check.sh << 'EOF'
#!/bin/bash

echo "Checking system resources..."

## メモリ使用率をチェックする
MEM_THRESHOLD=80
MEM_USED=$(free | grep Mem | awk '{print int($3/$2 * 100)}')

echo "Memory usage: ${MEM_USED}%"

## ディスク容量をチェックする
DISK_THRESHOLD=70
DISK_USED=$(df -h / | grep / | awk '{print $5}' | sed 's/%//')

echo "Disk usage: ${DISK_USED}%"

## CPU 負荷(1 分間平均)をチェックする
LOAD_THRESHOLD=1.0
CPU_LOAD=$(cat /proc/loadavg | awk '{print $1}')

echo "CPU load average: ${CPU_LOAD}"

## 複合条件チェック
if [ $MEM_USED -gt $MEM_THRESHOLD ] && [ $DISK_USED -gt $DISK_THRESHOLD ]; then
  echo "CRITICAL: Both memory and disk usage are high!"
  echo "Action: Free up resources immediately."
elif [ $MEM_USED -gt $MEM_THRESHOLD ] || [ $DISK_USED -gt $DISK_THRESHOLD ]; then
  echo "WARNING: Either memory or disk usage is high."
  echo "Action: Monitor system closely."
else
  echo "OK: Memory and disk usage are within acceptable limits."
fi

## 比較する前に負荷が数値であることをチェックする
if [[ $CPU_LOAD =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
  ## 浮動小数点数の比較には bc を使用する必要がある
  if (( $(echo "$CPU_LOAD > $LOAD_THRESHOLD" | bc -l) )); then
    echo "WARNING: CPU load is high. Check for resource-intensive processes."
  else
    echo "OK: CPU load is normal."
  fi
else
  echo "Error: Could not parse CPU load value."
fi
EOF

## スクリプトを実行可能にする
chmod +x resource_check.sh

## スクリプトを実行する
./resource_check.sh

このスクリプトは、メモリ使用率、ディスク容量、および CPU 負荷をチェックし、これらの条件の組み合わせに基づいて異なる出力を提供します。

最後に、複数の条件でユーザー入力を検証するスクリプトを作成しましょう。

## 入力検証スクリプトを作成する
cat > validate_input.sh << 'EOF'
#!/bin/bash

echo "Enter a username (lowercase letters only, 3-8 characters):"
read username

echo "Enter your age (must be 18 or older):"
read age

## ユーザー名の検証
is_valid_username=true

## ユーザー名が空でないことをチェックする
if [ -z "$username" ]; then
  echo "Error: Username cannot be empty."
  is_valid_username=false
fi

## ユーザー名の長さをチェックする
if [ ${#username} -lt 3 ] || [ ${#username} -gt 8 ]; then
  echo "Error: Username must be between 3 and 8 characters."
  is_valid_username=false
fi

## ユーザー名が小文字のみで構成されていることをチェックする
if [[ ! "$username" =~ ^[a-z]+$ ]]; then
  echo "Error: Username must contain only lowercase letters."
  is_valid_username=false
fi

## 年齢の検証
is_valid_age=true

## 年齢が数値であることをチェックする
if [[ ! "$age" =~ ^[0-9]+$ ]]; then
  echo "Error: Age must be a number."
  is_valid_age=false
fi

## 年齢が 18 歳以上であることをチェックする
if [ "$is_valid_age" = true ] && [ $age -lt 18 ]; then
  echo "Error: You must be at least 18 years old."
  is_valid_age=false
fi

## 最終検証
if [ "$is_valid_username" = true ] && [ "$is_valid_age" = true ]; then
  echo "Registration successful!"
  echo "Welcome, $username. Your account has been created."
else
  echo "Registration failed. Please correct the errors and try again."
fi
EOF

## スクリプトを実行可能にする
chmod +x validate_input.sh

## スクリプトを実行する
echo "You can test the script by running: ./validate_input.sh"

異なる入力でスクリプトを実行し、組み合わされた条件がユーザー入力を検証する仕組みを確認してみましょう。

## 有効な入力でテストする
echo -e "john\n25" | ./validate_input.sh

## 無効なユーザー名(短すぎる)でテストする
echo -e "jo\n25" | ./validate_input.sh

## 無効なユーザー名(大文字を含む)でテストする
echo -e "John\n25" | ./validate_input.sh

## 無効な年齢(18 歳未満)でテストする
echo -e "john\n17" | ./validate_input.sh

## 無効な年齢(数値でない)でテストする
echo -e "john\nabc" | ./validate_input.sh

これらの例は、複数の条件を組み合わせてスクリプト内で複雑な検証ロジックを作成する方法を示しています。

包括的なシステム監視スクリプトの作成

この最後のステップでは、これまで学んだことを総合して、包括的なシステム監視スクリプトを作成します。このスクリプトは、様々なシステムパラメータをチェックし、要約レポートを提供します。

複数のシステム側面を監視するスクリプトを作成しましょう。

## システム監視スクリプトを作成する
cat > system_monitor.sh << 'EOF'
#!/bin/bash

echo "========================================"
echo "    System Monitoring Report"
echo "    $(date)"
echo "========================================"
echo

## 1. 重要なシステムファイルが存在するかチェックする
echo "1. System Files Check:"
important_files=("/etc/passwd" "/etc/hosts" "/etc/resolv.conf")
all_files_exist=true

for file in "${important_files[@]}"; do
  if [ -e "$file" ]; then
    echo "   [OK] $file exists"
    
    ## ファイルが空でないことをチェックする
    if [ ! -s "$file" ]; then
      echo "   [WARNING] $file is empty"
    fi
    
    ## ファイルが読み取り可能であることをチェックする
    if [ ! -r "$file" ]; then
      echo "   [WARNING] $file is not readable"
    fi
  else
    echo "   [ERROR] $file does not exist"
    all_files_exist=false
  fi
done

if [ "$all_files_exist" = true ]; then
  echo "   All system files are present."
else
  echo "   Some system files are missing. Check the errors above."
fi
echo

## 2. ディスク容量をチェックする
echo "2. Disk Space Check:"
disk_usage=$(df -h / | grep / | awk '{print $5}' | sed 's/%//')
echo "   Root partition usage: ${disk_usage}%"

if [ $disk_usage -ge 90 ]; then
  echo "   [CRITICAL] Disk usage is critically high!"
elif [ $disk_usage -ge 70 ]; then
  echo "   [WARNING] Disk usage is getting high."
else
  echo "   [OK] Disk usage is normal."
fi
echo

## 3. メモリ使用率をチェックする
echo "3. Memory Usage Check:"
mem_total=$(free -m | grep Mem | awk '{print $2}')
mem_used=$(free -m | grep Mem | awk '{print $3}')
mem_percentage=$((mem_used * 100 / mem_total))

echo "   Memory usage: ${mem_percentage}% (${mem_used}MB used out of ${mem_total}MB)"

if [ $mem_percentage -ge 90 ]; then
  echo "   [CRITICAL] Memory usage is critically high!"
elif [ $mem_percentage -ge 70 ]; then
  echo "   [WARNING] Memory usage is getting high."
else
  echo "   [OK] Memory usage is normal."
fi
echo

## 4. アクティブなプロセスをチェックする
echo "4. Process Check:"
critical_processes=("sshd" "cron")
for process in "${critical_processes[@]}"; do
  if pgrep -x "$process" > /dev/null; then
    echo "   [OK] $process is running"
  else
    echo "   [ERROR] $process is not running"
  fi
done
echo

## 5. システム負荷をチェックする
echo "5. System Load Check:"
load_1min=$(cat /proc/loadavg | awk '{print $1}')
load_5min=$(cat /proc/loadavg | awk '{print $2}')
load_15min=$(cat /proc/loadavg | awk '{print $3}')

echo "   Load average: $load_1min (1 min), $load_5min (5 min), $load_15min (15 min)"

## CPU コア数を判定する
num_cores=$(grep -c ^processor /proc/cpuinfo)
load_threshold=$(echo "scale=2; $num_cores * 0.7" | bc)

if (( $(echo "$load_1min > $load_threshold" | bc -l) )); then
  echo "   [WARNING] High load detected. The system might be under stress."
else
  echo "   [OK] System load is normal."
fi
echo

## 6. 最近のログイン失敗試行をチェックする
echo "6. Security Check:"
if [ -f /var/log/auth.log ]; then
  failed_logins=$(grep "Failed password" /var/log/auth.log | wc -l)
  echo "   Failed login attempts: $failed_logins"
  
  if [ $failed_logins -gt 10 ]; then
    echo "   [WARNING] High number of failed login attempts detected."
  else
    echo "   [OK] Normal login activity."
  fi
else
  echo "   [INFO] Cannot check login attempts (auth.log not accessible)"
fi
echo

## 7. 要約
echo "7. System Status Summary:"
critical_count=$(grep -c "\[CRITICAL\]" <<< "$(cat /dev/stdin)")
warning_count=$(grep -c "\[WARNING\]" <<< "$(cat /dev/stdin)")
error_count=$(grep -c "\[ERROR\]" <<< "$(cat /dev/stdin)")

if [ $critical_count -gt 0 ]; then
  echo "   [CRITICAL] System has critical issues that need immediate attention!"
elif [ $warning_count -gt 0 ] || [ $error_count -gt 0 ]; then
  echo "   [WARNING] System has some issues that should be addressed soon."
else
  echo "   [OK] System is operating normally. No significant issues detected."
fi

echo
echo "========================================"
echo "    End of System Monitoring Report"
echo "========================================"
EOF

## スクリプトを実行可能にする
chmod +x system_monitor.sh

## スクリプトを実行する
./system_monitor.sh

この包括的なスクリプトは、以下のチェックを実行します。

  1. 重要なシステムファイルが存在し、読み取り可能であることを検証する
  2. ディスク容量の使用状況をチェックする
  3. メモリ使用率を監視する
  4. 重要なプロセスが実行中であることを確認する
  5. システム負荷を評価する
  6. セキュリティログを調べて、ログイン失敗試行を確認する
  7. システムの全体的な状態の要約を提供する

出力はシステムの現在の状態によって異なりますが、システムの健全性の包括的な概要を提供します。

このスクリプトをさらに有用にするには、以下のことができます。

  1. cron を使用して定期的に実行するようにスケジュールする
  2. 重大な問題が検出されたときにメールでアラートを送信するように設定する
  3. システムに関連するより具体的なチェックを追加する

定期的に実行するようにスケジュールできる簡易版を作成しましょう。

## スケジュール用の簡易監視スクリプトを作成する
cat > daily_check.sh << 'EOF'
#!/bin/bash

## ログファイルを設定する
LOG_FILE="/tmp/system_check_$(date +%Y%m%d).log"

## ログ記録を開始する
echo "System Check: $(date)" > $LOG_FILE
echo "--------------------------------" >> $LOG_FILE

## ディスク容量をチェックする
disk_usage=$(df -h / | grep / | awk '{print $5}' | sed 's/%//')
echo "Disk usage: ${disk_usage}%" >> $LOG_FILE

if [ $disk_usage -ge 90 ]; then
  echo "CRITICAL: Disk usage is critically high!" >> $LOG_FILE
elif [ $disk_usage -ge 70 ]; then
  echo "WARNING: Disk usage is getting high." >> $LOG_FILE
else
  echo "OK: Disk usage is normal." >> $LOG_FILE
fi

## メモリをチェックする
mem_total=$(free -m | grep Mem | awk '{print $2}')
mem_used=$(free -m | grep Mem | awk '{print $3}')
mem_percentage=$((mem_used * 100 / mem_total))
echo "Memory usage: ${mem_percentage}%" >> $LOG_FILE

if [ $mem_percentage -ge 90 ]; then
  echo "CRITICAL: Memory usage is critically high!" >> $LOG_FILE
elif [ $mem_percentage -ge 70 ]; then
  echo "WARNING: Memory usage is getting high." >> $LOG_FILE
else
  echo "OK: Memory usage is normal." >> $LOG_FILE
fi

## 重要なサービスをチェックする
for service in sshd cron; do
  if pgrep -x "$service" > /dev/null; then
    echo "$service is running" >> $LOG_FILE
  else
    echo "WARNING: $service is not running" >> $LOG_FILE
  fi
done

## ログを終了する
echo "--------------------------------" >> $LOG_FILE
echo "Check completed at $(date)" >> $LOG_FILE

## ログの保存場所を表示する
echo "System check completed. Log saved to $LOG_FILE"
EOF

## スクリプトを実行可能にする
chmod +x daily_check.sh

## スクリプトを実行する
./daily_check.sh

このスクリプトを毎日実行するようにスケジュールするには、通常 cron システムを使用します。設定方法は以下の通りです。

## cron ジョブの設定方法を表示する(この実験環境では実際に作成しない)
echo "To schedule this script to run daily at 9 AM, you would use:"
echo "crontab -e"
echo "And add the line:"
echo "0 9 * * * /home/labex/project/daily_check.sh"

これは、これまで学んだ Linux の条件テストコマンドが、実用的なシステム監視ツールの作成にどのように適用できるかを示しています。

まとめ

この実験では、Linux の条件テストを使用してさまざまなタイプの条件を評価し、その結果に基づいて判断を下す方法を学びました。以下は、あなたが達成したことのまとめです。

  1. test コマンドの基本と、ファイルの存在、読み取り可能性、サイズなどのプロパティをチェックする方法を学びました。

  2. ==!=-z-n などの演算子を使用した文字列比較を探索し、入力を検証し、テキスト内容に基づいて判断を下す方法を学びました。

  3. -eq-ne-lt-gt-le-ge などの演算子を使用した数値比較を行い、数値を評価する方法を学びました。

  4. 論理演算子 (&&||!) を使用して複数の条件を組み合わせ、複雑な判断ロジックを作成しました。

  5. これらのすべての技術を適用して、さまざまなシステムパラメータをチェックし、ステータスレポートを提供できる包括的なシステム監視スクリプトを作成しました。

これらのスキルは、Linux でのシェルスクリプト作成とシステム管理において基本的なものです。条件をテストし、その結果に基づいて異なるアクションを実行する能力により、タスクを自動化し、入力を検証し、エラーを処理し、システムの健全性を監視するスクリプトを作成することができます。

あなたが学んだことのいくつかの実用的なアプリケーションには、以下のようなものがあります。

  • 実行前に利用可能なスペースをチェックする自動バックアップスクリプトの作成
  • ユーザー向けスクリプトの入力検証の開発
  • 管理者に潜在的な問題を警告するシステム監視ツールの構築
  • 条件付きロジックを使用した定期的なシステムメンテナンスタスクの自動化

Linux での作業を続けるにつれて、条件テストは作成または保守するほぼすべてのシェルスクリプトの重要な部分であることがわかるでしょう。