スクリプトのエラー処理とログ出力
堅牢なエラー処理を実装し、スクリプトの出力をリダイレクトして、実行状況の監視や問題のトラブルシューティングに役立つログを生成します。
「スクリプトのエラー処理とログ出力」はCoddyKit上の無料Linux Server Deployment & SSH Masteryレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLinux Server Deployment & SSH Mastery学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Linux Server Deployment & SSH Masteryコースには全4レッスンが含まれています。
スクリプトの信頼性を高める
サーバー上でスクリプトが実行され、重要な処理を行っているところを想像してください。何か問題が起きたら、どうなるでしょうか。
- 何も知らせずに失敗してしまわないでしょうか。
- 後に混乱を残さないでしょうか。
- いつ、なぜ失敗したのか確認できるでしょうか。
堅牢なスクリプトはエラーを適切に処理し、分かりやすいログを出力します。このレッスンでは、その方法を学びます。
終了コードを理解する
Linuxのすべてのコマンドとスクリプトは、処理が終了すると終了コード(または終了ステータス)を返します。この数値によって、処理が成功したか失敗したかが分かります。
0:成功を表します。すべて正常に完了しました。1-255:失敗を表します。特定の数値がエラーの種類を示す場合もあります。
実際に確認してみましょう。
#!/bin/bash
# This script demonstrates exit codes
echo "Attempting a successful command..."
ls /tmp
echo "Exit code for 'ls /tmp': $?"
echo
echo "Attempting a failing command..."
ls /nonexistent_directory
echo "Exit code for 'ls /nonexistent_directory': $?"コマンドのステータスを確認する
コマンドの実行後は、特殊な変数$?を使って終了コードを確認できます。これは、スクリプト内で処理を分岐するときに非常に便利です。
if文を使って、成功または失敗に応じた処理を実行できます。
#!/bin/bash
# Check if a file exists before trying to read it
FILENAME="test_file.txt"
touch $FILENAME # Create it for success case
if [ -f "$FILENAME" ]; then
echo "File '$FILENAME' exists. Processing..."
# ... do something with the file ...
rm $FILENAME # Clean up
else
echo "Error: File '$FILENAME' not found!"
exit 1
fi
echo "Script finished."<code>set -e</code>:エラー時に終了する
単純なスクリプトでも、あらゆる場所で$?を手動確認するのは面倒です。set -eコマンドを使うと、スクリプトの動作を変更できます。
- いずれかのコマンドがゼロ以外のステータスで終了すると(失敗すると)、スクリプトは直ちに終了します。
- これにより、破損している可能性のあるデータや無効な状態のまま、スクリプトが処理を続行するのを防げます。
このスクリプトを実行してみてください。cpコマンドが失敗すると、どうなるでしょうか。
#!/bin/bash
set -e
echo "Starting important operations..."
mkdir my_temp_dir
cp /nonexistent_source my_temp_dir/target # This will fail
echo "This line will not be reached if cp fails."
rmdir my_temp_dir
echo "Script finished successfully."クリーンアップに使う<code>trap</code>
スクリプトが失敗しても、一時ファイルの削除など、クリーンアップ処理が必要な場合があります。trapコマンドを使うと、シグナル(終了やエラーなど)を捕捉してコマンドを実行できます。
EXIT:成功か失敗かにかかわらず、スクリプトの終了時に実行されます。ERR:コマンドがゼロ以外のステータスで終了したときに実行されます(set -eが有効な場合)。
ここでは、一時ディレクトリが必ず削除されるようにしています。
#!/bin/bash
TEMP_DIR="/tmp/my_script_temp_$(date +%s)"
function cleanup {
echo "Cleaning up temporary directory: $TEMP_DIR"
rm -rf "$TEMP_DIR"
}
trap cleanup EXIT
mkdir "$TEMP_DIR"
echo "Working in $TEMP_DIR..."
# Simulate some work, maybe it fails
# cp /nonexistent_file "$TEMP_DIR/" # Uncomment to test failure
echo "Script completed."出力をリダイレクトする
スクリプトを実行すると、メッセージが表示されることがよくあります。メッセージは主に次の2種類です。
- 標準出力(stdout):通常のメッセージ(ファイルディスクリプター1)。
- 標準エラー出力(stderr):エラーメッセージ(ファイルディスクリプター2)。
これらのストリームは、画面ではなくファイルにリダイレクトできます。
command > file:標準出力をfileにリダイレクトします。command 2> file:標準エラー出力をfileにリダイレクトします。
成功メッセージとエラーメッセージを別々に保存してみましょう。
#!/bin/bash
# Redirect stdout to success.log and stderr to error.log
echo "This is a success message." > success.log
ls /nonexistent_path 2> error.log
echo "Check success.log and error.log files."
# To view them after running:
# cat success.log
# cat error.logすべての出力を1つのファイルにまとめる
標準出力と標準エラー出力の両方を1つのログファイルにまとめると、確認しやすく便利なことがよくあります。方法はいくつかあります。
command > file 2>&1:標準出力をfileにリダイレクトし、その後、標準エラー出力を標準出力の出力先(この場合はファイル)にリダイレクトします。command &> file:同じ処理を行う、より短く新しい構文です。
スクリプトの実行内容を包括的なログとして記録するのに適しています。
#!/bin/bash
# Redirect both stdout and stderr to a single log file
LOG_FILE="combined_script.log"
echo "Starting script..." &> "$LOG_FILE"
echo "This message goes to stdout." &>> "$LOG_FILE"
ls /nonexistent_dir 2>&1 | tee -a "$LOG_FILE"
echo "Script finished." &>> "$LOG_FILE"
echo "Check the '$LOG_FILE' file for all output."ログにタイムスタンプを付ける
デバッグでは、イベントがいつ発生したかを把握することが重要です。ログメッセージにタイムスタンプを追加すると、ログがより役立つものになります。
dateコマンドを使って、現在の日付と時刻を各ログエントリの先頭に追加できます。これにより、イベントを時系列で追跡しやすくなります。
#!/bin/bash
LOG_FILE="timestamped_script.log"
function log_message {
echo "$(date +%Y-%m-%d_%H:%M:%S) - $1" &>> "$LOG_FILE"
}
log_message "Script started."
sleep 1
log_message "Performing task A..."
# Simulate an error
ls /no_such_place || log_message "Error: Command failed."
sleep 1
log_message "Script finished."
echo "Check '$LOG_FILE' for timestamped entries."<code>logger</code>でシステムログに送る
重要なイベントについては、メッセージをシステムのロギング機能(syslog)に直接送信するとよいでしょう。loggerコマンドを使うと、その処理を行えます。
- システムログは、(systemdを使用するシステムでは)
journalctlなどのツールで管理されることがよくあります。 - これにより、スクリプトの重要なメッセージを他のシステムイベントと一元管理できます。
- 重大なエラーや監査証跡の記録に便利です。
loggerで送信したメッセージは、journalctl -fまたはtail -f /var/log/syslogで確認できます(システムによって異なります)。
#!/bin/bash
# Send a message to system logs
SCRIPT_NAME="MyBackupScript"
logger -t "$SCRIPT_NAME" "Starting daily backup operation."
# Simulate a task
sleep 2
if [ $(($RANDOM % 2)) -eq 0 ]; then
logger -t "$SCRIPT_NAME" -p user.info "Backup successful."
else
logger -t "$SCRIPT_NAME" -p user.err "Backup failed: Disk full."
fi
echo "Messages sent to system logs. Check with 'journalctl -t $SCRIPT_NAME'."エラー処理の確認
いくつかのファイルを処理するBashスクリプトを作成しました。スクリプト内のいずれかのコマンドが失敗したら直ちに終了し、さらに、スクリプトがどのように終了しても一時ディレクトリを確実に削除したいとします。
これを実現するために、主に使用するBashコマンドを2つ挙げてください。
まとめと次のステップ
Bashスクリプトをより堅牢にし、デバッグしやすくする方法を学びました。
- 終了コード:コマンドの成功または失敗を理解します。
set -e:エラー時に自動的に終了します。trap:スクリプトの終了時にクリーンアップ処理を実行します。- 出力のリダイレクト:標準出力と標準エラー出力の出力先を制御します。
- タイムスタンプ:ログに状況を把握するための情報を追加します。
logger:システム全体のロギング機能と連携します。
これらのテクニックを適用することで、自動化タスクの信頼性と管理性を高められます。本当に堅牢な自動化を実現できるよう、練習を続けてください。
よくある質問
「スクリプトのエラー処理とログ出力」レッスンは無料ですか?
はい。「スクリプトのエラー処理とログ出力」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Linux Server Deployment & SSH Masteryコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Linux Server Deployment & SSH Masteryコースには全4レッスンが含まれています。
「スクリプトのエラー処理とログ出力」で何を学びますか?
堅牢なエラー処理を実装し、スクリプトの出力をリダイレクトして、実行状況の監視や問題のトラブルシューティングに役立つログを生成します。 ブラウザで直接実行するハンズオンコードでLinux Server Deployment & SSH Masteryを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Linux Server Deployment & SSH Masteryを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLinux Server Deployment & SSH Masteryは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「スクリプトのエラー処理とログ出力」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLinux Server Deployment & SSH Masteryレッスンでコードを書いて実行できますか?
はい。すべてのLinux Server Deployment & SSH Masteryレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Bashスクリプティング入門
- サーバータスクの自動化
- スクリプトのエラー処理とログ出力
- 関数、引数、再利用可能なスクリプト