Linuxの終了コードを使用してLinuxシステムをトラブルシューティングする方法

Linuxの終了コードで迅速にトラブルシューティングできます

終了コードは、リターンコードまたは終了ステータスとも呼ばれ、プログラム、コマンド、またはスクリプトが実行を終了したときにオペレーティングシステム(または呼び出しプロセス)に返す数値信号です。失敗を診断するために長いログファイルを掘り下げる必要はありません。終了コードは、問題の性質についての迅速な手がかりを提供することがよくあります。

一般的に受け入れられている慣習は、プログラムが正常に実行されると、終了コード0を返すことです。それ以外の数値、通常は1から255の標準範囲内の数値は、何かがうまくいかなかったことを示します。

Unix系シェル(BashやZshなど)で最後に実行されたフォアグラウンドコマンドの終了コードを確認する最も簡単な方法は、特別なシェル変数$?を調べることです。たとえば、最初に任意のコマンドを実行し、その後に終了コードを確認します:

ls/nonexistent_directory  
echo$?

最後に実行されたコマンドの終了コードを表示

echo $?コマンドは、$?変数に格納されている数値の終了コードを表示します。0が表示されると、前のコマンドが正常に完了したことを意味します。1、2、または127のような非ゼロの値はエラーを示し、特定の数値は問題の種類についての手がかりを提供します。たとえば、ファイルが見つからない、存在しないディレクトリ、または権限が不十分である可能性があります。

終了コードを使用したスクリプトのデバッグ

終了コードは、シェルスクリプトを書くときに特に便利です。これにより、スクリプトは何かが正しく行われたかどうかを判断し、次に何をするかを決定できます。

以下は、ファイルをバックアップフォルダーにコピーし、コピーが成功したかどうかを報告する簡単な例です:

#!/bin/bash  
# ファイルをコピーしようとする  
cp important_file.txt backup/  
  
# 終了コードを使用してコピーが成功したかどうかを確認する($?は最後のコマンドの終了コードを保持)  
if[$?-eq0]; then  
echo"バックアップ成功!"  
else  
echo"バックアップが終了コード $? で失敗しました"  
exit1# エラーコードでスクリプトを終了して何かがうまくいかなかったことを示す。  
fi

cpコマンドが実行されると、終了コードが返されます。終了コード0はすべてが順調であったことを意味します。コードが0でない場合、何かがうまくいかなかったことを示し、スクリプトはエラーメッセージを表示し、コード1で終了します。

独自の終了コードを設定する

コマンドの終了コードを確認することに加えて、異なる種類のエラーを示すために独自の終了コードを定義することもできます。この慣行により、スクリプトがより情報豊かになり、使用する人が発生した問題の種類を正確に理解できるようになります。

以下のスクリプトを考えてみてください:

#!/bin/bash  
# 引数(ファイル名)が提供されていることを確認する。  
if[-z"$1"]; then  
echo"使用法: $0 "  
exit1# 終了コード1は引数が提供されていないことを示す。  
fi  
  
# 最初の引数として提供されたファイルが存在するかどうかを確認する。  
if[!-f"$1"]; then  
echo"エラー: ファイルが見つかりません"  
exit2# カスタム終了コード2はファイルが見つからなかったことを示す。  
fi

誰かがあなたのスクリプトを実行し、失敗した場合、彼らは終了コードを参照して正確なエラーを特定できます。この例では、終了コード1はユーザーが必要な引数を提供しなかったことを示し、終了コード2はファイルが見つからなかったことを明示的に示します。この構造化されたアプローチは、スクリプトがより大きなシステムの一部である場合や、他のスクリプトがその出力に依存している場合に特に便利です。

一般的な終了コードのリスト

異なるプログラムは独自の終了コードを定義できますが、多くのコマンドラインツール、特にLinuxやUnix系システムでは、いくつかの一般的なパターンが見られます。以下は、最も頻繁に遭遇するものです:

  • 0: すべてが良好です!プログラムは問題なく実行されました。
  • 1: 何かがうまくいかなかったが、エラーは特定されていません。これは終了コードのキャッチオールのようなものです。
  • 2: シェルビルトインの誤用。これは、必要なパラメータを忘れるなど、コマンドを誤って使用した場合に発生する可能性があります。
  • 126: コマンドは存在しますが、実行する権限がありません。
  • 127: コマンドが見つかりません。これは、コマンドが存在しないか、システムのパスにないことを意味します。スペルを再確認してください。
  • 128: 無効な終了引数。終了コードとして意味をなさない数値を使用しました。
  • 130: Ctrl + Cによってプログラムが終了されました。これは、プログラムを手動で停止したときに発生します。
  • 137: メモリ不足(OOM)状態。
  • 255: プログラムが有効な範囲外の終了コードを返そうとしました。

特定のプログラムには独自のユニークな終了コードがあります。たとえば、grepは一致が見つかったときに0を返し、一致が見つからなかったときに1を返し、エラーが発生したときに2を返します。また、開発者は技術的にはほぼ任意の数(通常はUnix系システムで0から255)を使用できます。

成功または失敗に基づくコマンドのチェーン

Bashは、前のコマンドが成功したか失敗したかに応じてコマンドを連結するための便利な演算子&&||を提供します:

  • &&(AND演算子):前のコマンドが成功した場合(終了コード0)のみ、次のコマンドを実行します。
  • ||(OR演算子):前のコマンドが失敗した場合(非ゼロ終了コード)のみ、次のコマンドを実行します。

たとえば、ディレクトリを作成し、その後すぐにその中に移動したいとします。ディレクトリの作成が失敗したり、その中に移動できなかった場合、エラーメッセージを表示したいかもしれません:

mkdir new_directory &&cd new_directory ||echo"ディレクトリの作成とアクセスに失敗しました"

ここで、mkdir new_directoryはフォルダーを作成しようとします。それが成功した場合、コードはすぐにcd new_directoryを実行します。どちらかのステップが失敗した場合、||演算子が作動し、エラーメッセージを表示します。

最後の考え

終了コードは小さな詳細のように見えるかもしれませんが、コマンドラインツールを強力にする要素の一部です。成功と失敗についてプログラムがコミュニケーションを取るための共通の言語を作り、複雑なシステムを構築するために不可欠です。

コマンドライン作業に不慣れな場合は、コマンドが期待通りに動作しないときにecho $?を確認する習慣を身につけてください。すぐに、自分のスクリプトで終了コードを使用し、このシンプルで効果的なコミュニケーションシステムを評価するようになるでしょう。