1. TOPTOP
  2. Webサービス
  3. Linux

シェルスクリプトの特殊パラメータについて ~ 異常終了ではなぜダメなのか?

shellscript_special_parameter_1

ドットインストールのシェルスクリプト入門 #04 特殊変数を使ってみよう(新しいタブで開く)を見ていると、特殊変数(以下、特殊パラメータとします)として5つのパラメータが紹介されています。

$1, $2 ... 引数。引数の順番
$0 スクリプトの名前
$# 引数の数
$@ すべての引数の表示
$* $@と同じ

一方、新しいシェルプログラミングの教科書(新しいタブで開く)のP.42を読んでいると4つの特殊パラーメータが表現されています。

$# (ドットインストールと同じ)
$? 直前に実行したコマンドのステータス値
$$ 現在のプロセスのプロセスID
$! 最後に実行したバックグラウンドコマンドのプロセスID

今回の記事では、ドットインストールの記事では紹介されていない、”$?“の重要性について考えてみたいと思います。なお今回の記事を書くにあたって、下記の3つのページを参考にしています。

特殊パラーメータ”$?”について

“$?”を調べているとステータス値が0であれば正常終了で、1以上の数値が出現すると異常終了とされます。例えばファイルの中身を調べるコマンドである、”cat”を”ca”と打ち込んでしまうと、異常終了していることが分かります。

$ ca
-bash: ca: コマンドが見つかりません
$ echo $?
127

“127”は「コマンドが見つかりません」というメッセージの通りで、コマンドのタイピングが間違っていることを示します。他にどんな終了コードが存在しているかは、Exit Codes With Special Meanings(新しいタブで開く)を調べると良いでしょう。

異常終了の何が問題か

では、思考を一歩深めて異常終了の何が問題でしょうか?”cat”を”ca”とタイピングミスをして終了するぐらいであれば、大した問題ではありません。ですがWordPressのバックアップを実行するような、複雑なシェルスクリプトで実行するときのことを考えてみましょう。

処理ごとにステータス値の確認

例としてさくらのナレッジの記事(新しいタブで開く)よりコードを一部引用させていただきます。

# MAIN処理
# /var/www/html以下のファイルを
# /backup/wordpressfile_YYYYMMDD-HHMMSS.tar.gzとして保存します。
eval "tar czf /backup/wordpressfile_${datestr}.tar.gz /var/www/html"
if [ $? -ne 0 ]
then
    echo "[ERROR]tar error."
    STATUS=1
fi

# データベースのデータをエクスポートして
# /backup/wordpressdb_YYYYMMDD-HHMMSS.sql.gzとして保存します。
# 青色の部分を修正してください。
eval "mysqldump -u root -ppassword データベース名 |gzip -c > /backup/wordpressdb_${datestr}.sql.gz"
if [ $? -ne 0 ]
then
    echo "[ERROR]mysqldump error."
    STATUS=1
fi

WordPressのディレクトリを圧縮ファイルにするスクリプトと、データベースファイルをコピーして圧縮ファイルにするでそれぞれステータス値の確認を行なっています。この例では、処理ごとに”if [ $? -ne 0 ]”で条件文を作成し、異常終了が発生したときに何が原因か事細かくチェックできるようプログラミングされています。

CPUを圧迫する異常終了

WordPressのバックアップを実行するシェルスクリプトは複数のジョブを組み合わされています。そのどこかの処理で異常終了を発生させてしまうと、プロセス(実行中のプログラム。正確には子プロセス)が止まらなくなってしまう恐れがあります。

そうするとどうなるでしょうか?CPU(プロセッサ。中央処理装置)に実行中のプログラムがたまってしまい、サーバーのパフォーマンスに悪影響を及ぼします。その結果としてプログラミングの実行結果が遅くなったり、Webサイトの表示速度が遅くなってしまいます。

半導体の進化とともにCPUの性能も向上していますが、複雑なスクリプトを書いたり、大量のリクエストを捌く必要があるサーバーを扱う方にとっては、プロセスが正常終了するか異常終了するか大きな関心事ではないでしょうか。個人的にはあまりハードウェアについては関心がありませんでしたが、自分で調べてはじめて、正常終了と異常終了の意味の違いが分かりました。