2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

Linuxの学習中、コマンドエラーが発生する度にマニュアルを確認したり、AIにエラーメッセージをコピー&ペーストして解析していましたが、何度もエラーが発生するのでその度に確認するのが少し面倒でした。

そこで、、
エラーが出たら自動的にAIに連携できれば便利じゃないか?

と考えました:rolling_eyes:

要件

概要

Linuxでコマンド実行時にエラーが発生した場合、その内容を生成AIへ連携し、原因や対策をコマンドライン上へ表示するツール

機能

①ユーザーが実行したLinuxコマンドの終了ステータスを確認
②エラー発生を検知
③AIへの連携前に確認
④ユーザーによる選択後、AIへエラー内容を自動連携
⑤解析結果をコマンドライン上に表示

ポイント

①不要なコストを抑制するために、AIへの連携前にユーザに確認をする
→例)AIに連携するまでもない単純なタイポでのコスト増加を防止
②解析結果は初心者向けを意識した内容にする

実行時イメージ

コマンドエラー検知~解析するかの確認

image.png

解析を実行した場合

image.png
image.png

解析を実行しなかった場合

image.png

実施手順

①さくらのAI Engineへの接続準備

・アカウントトークン発行
image.png
・使用するAPIを選択
今回は https://api.ai.sakura.ad.jp/v1/chat/completions
を選択しています
image.png
・利用するライブラリのインストール

pip install requests

・今回は「config.py」という名称のファイルを作成し、以下を記述

API_KEY = "xxxxxxxx"
BASE_URL = "https://api.ai.sakura.ad.jp/v1/chat/completions"

②解析用のスクリプトを作成

・「config.py」と同じディレクトリに「AI」というファイルを作成し、以下を記述

#!/usr/bin/env python3

import sys
import requests
import subprocess

from config import API_KEY, BASE_URL

command = ""

# ------------------------
# コマンド実行モード
# 例:
# AI "cat aaa.txt"
# ------------------------
if len(sys.argv) > 1:

    command = " ".join(sys.argv[1:])

    result = subprocess.run(
        command,
        shell=True,
        capture_output=True,
        text=True
    )

    # 正常終了
    if result.returncode == 0:
        print("✅ 実行成功\n")
        print(result.stdout)
        sys.exit()

    # エラー発生
    error_text = f"""
実行コマンド:
{command}

エラー内容:
{result.stderr}
"""

# ------------------------
# パイプ入力モード
# 例:
# cat aaa.txt 2>&1 | AI
# ------------------------
else:
    error_text = sys.stdin.read()

prompt = f"""
以下のLinuxエラーを初心者向けに解説してください。

以下の形式で回答してください。

【原因】

【対策】

【実行して確認するコマンド】

【初心者向け解説】

エラー情報:

{error_text}
"""

payload = {
    "model": "gpt-oss-120b",
    "messages": [
        {
            "role": "user",
            "content": prompt
        }
    ]
}

print("🔍 AI解析中...")

response = requests.post(
    BASE_URL,
    headers={
        "Authorization": f"Bearer {API_KEY}"
    },
    json=payload
)

if response.status_code != 200:
    print("APIエラー")
    print(response.text)
    sys.exit()

data = response.json()

answer = data["choices"][0]["message"]["content"]

print("\n===== AI解析結果 =====\n")
print(answer)

・「AI」に実行権限を付与

chmod +x AI

③ CLIツールにする

・どのディレクトリからも利用できる場所へ移動

cp AI ~/.local/bin/AI
chmod +x ~/.local/bin/AI

④ Bashから利用できるようににする

・~/.bashrc へ以下記述を追加

auto_ai_error_check() {

    LAST_STATUS=$?

    # 正常終了なら何もしない
    [ $LAST_STATUS -eq 0 ] && return

    LAST_CMD=$(history 1 | sed 's/^[ ]*[0-9]*[ ]*//')

    # 空入力は無視
    [ -z "$LAST_CMD" ] && return

    # AI自身は無視
    case "$LAST_CMD" in
        AI* )
            return
            ;;
    esac

    echo
    echo "❌ コマンドが失敗しました"
    echo "実行コマンド: $LAST_CMD"
    echo

    read -p "AIで解析しますか? (y/N): " ANSWER

    case "$ANSWER" in
        y|Y)
            AI "$LAST_CMD"
            ;;
        *)
            echo "解析をスキップしました"
            ;;
    esac
}

PROMPT_COMMAND=auto_ai_error_check

・設定を反映

source ~/.bashrc

⑤実際にコマンド実行して動作確認

苦労した点

・はじめはエラーが出たら即API連携する設計にしていましたが、単純なタイポや改行しただけの場合は除く設計に変更するのに時間がかかりました。
・CLIとして利用できる場所へ移動した後、しばらく移動前のファイルを編集してしまっていました。:sweat_smile:

まとめ

今回はLinuxコマンドのエラーを検知し、
必要に応じて生成AIへ解析を依頼できるツールを作成しました。

Linux学習中はエラーが発生する機会が多いため、原因調査の手間を減らせるようになりました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?