ラベル SwiftBar の投稿を表示しています。 すべての投稿を表示
ラベル SwiftBar の投稿を表示しています。 すべての投稿を表示

2026年5月5日火曜日

SwiftBarで構築するLLM(llama-server)のワンクリック起動環境

 

1. 実装のゴール

M4 Maxのパワーを活かし、ローカルLLM環境(llama.cpp)をターミナルなしで制御することを目指します。

  • メニューバーにステータス(起動中/停止中)を表示。

  • ワンクリックで llama-server を起動・停止。

  • SwiftBarの仕様に基づき、エラー(はてなマーク)を徹底排除する。

2. 起動・制御用シェルスクリプト

今回作成した llama_control.1s.sh の全容です。

--------------Bash-------------------
#!/bin/bash

# --- 環境設定 ---
# GUIアプリから呼ばれるため、PATHを明示してコマンドを見失わないようにする
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

# パス設定(各自の環境に合わせて変更)
MODEL_PATH="/Users/hidenari/models/Qwen3.5-9B-Q8_0.gguf"
LOG_FILE="/tmp/llama.log"
# SwiftBarに無視させるため、PIDファイルはドット(.)で始めるのがコツ
PID_FILE="/Users/hidenari/Documents/SwiftBar/.llama-server.pid"
# 自分自身のフルパス(SwiftBarの再帰呼び出しを確実にするため)
SELF_PATH="/Users/hidenari/Documents/SwiftBar/llama_control.1s.sh"

# --- プロセスチェック ---
# pgrepでプロセスを直接確認。名前で狙い撃ち
CURRENT_PID=$(pgrep -f "llama-server.*Qwen3.5-9B")

if [ -n "$CURRENT_PID" ]; then
    STATUS="Running"
    COLOR="green"
    ICON="🤖"
else
    STATUS="Stopped"
    COLOR="red"
    ICON="💤"
fi

# --- SwiftBarへの出力 ---
# メニューバーの表示
echo "$ICON LLM: $STATUS | color=$COLOR"
echo "---"

if [ "$STATUS" = "Stopped" ]; then
    # 起動コマンド:ターミナルを開かずバックグラウンドで実行
    echo "Launch Qwen 3.5 | bash='$SELF_PATH' param1=start terminal=false"
else
    # 停止コマンド
    echo "Stop llama-server | bash='$SELF_PATH' param1=stop terminal=false"
    echo "PID: $CURRENT_PID"
fi

# --- 実行ロジック(SwiftBarからの引数 $1 で分岐) ---
case "$1" in
    start)
        if [ -z "$CURRENT_PID" ]; then
            cd /Users/hidenari/llama.cpp/build/bin/
            # M4 Maxの性能をフル活用(GPU全レイヤー、Flash Attention有効)
            nohup ./llama-server -m "$MODEL_PATH" -c 65536 --n-gpu-layers 99 --port 8080 --flash-attn on > "$LOG_FILE" 2>&1 &
            sleep 2
        fi
        ;;
    stop)
        # 確実にプロセスを終了させる
        TARGET_PID=$(pgrep -f "llama-server.*Qwen3.5-9B")
        [ -n "$TARGET_PID" ] && kill -9 $TARGET_PID
        ;;
esac
---------------------------------------------------

3. こだわりの「記載過程」とエンジニアの知恵

① 「はてなマーク」との決別:隠しファイルの活用

SwiftBarはディレクトリ内の全ファイルを自動実行しようとします。以前、プロセスIDを保存する llama-server.pidを置いていたところ、SwiftBarがそれを「スクリプト」と勘違いして実行しようとし、エラー(はてなマーク)が発生しました。

  • 対策: ファイル名を .llama-server.pid とドットから始まる隠しファイルに。SwiftBarはこのファイルを無視するため、メニューバーがクリーンに保たれます。

② 「自分自身」をフルパスで定義する

GUIアプリであるSwiftBarから呼び出される際、相対パス($0)は不安定になりがちです。

  • 対策SELF_PATH 変数にスクリプトのフルパスを直接記載。これにより、メニューからクリックした際のコマンド実行ミスをゼロにしました。

③ M4 Maxのポテンシャルを活かす

起動パラメータに --n-gpu-layers 99 と --flash-attn on を指定。

  • これにより、Qwen 3.5クラスのモデルも爆速で動作。ハードの性能を最大限引き出すのがインフラエンジニアの醍醐味です。

M4 Maxをさらに快適に。SwiftBarでLLM(llama-server)とメモリ解放をメニューバーから一元管理する

 

1. はじめに

  • 動機: M4 Max搭載Mac Studioという強力なインフラを最大限活かすため、ローカルLLM(Qwen 3.5など)の起動・停止や、purge コマンドによるメモリリフレッシュをGUI(メニューバー)から行えるようにしたかった。

  • 使用ツール: SwiftBar(Macのメニューバーにスクリプトの結果を表示し、操作を可能にするオープンソースアプリ)

2. SwiftBarの導入

  • インストールSwiftBar公式サイト または brew install --cask swiftbar で導入。

  • プラグインディレクトリの設定: スクリプトを保存するための専用ディレクトリ(例: ~/Documents/SwiftBar)を作成し、SwiftBarに指定する。

3. メモリ解放(purge)の自動化

sudo 権限が必要な purge コマンドを、パスワード入力なしでメニューバーから実行するための設定。

  • visudoの設定: セキュリティを保ちつつ、特定のコマンドだけパスワードなしで実行できるようにする。

    -------------Bash----------------------------------
    # sudo visudo で末尾に追記
    hidenari[User名] ALL=(ALL) NOPASSWD: /usr/sbin/purge
    
    ---------------------------------------------
  • スクリプトの作成 (purge_memory.1m.sh):

    • 1m という名前をつけることで1分ごとに更新。

    • 実行時の標準エラー出力を > /dev/null 2>&1 で捨てるのが、SwiftBarに「はてなマーク(エラー)」を出させないコツ。

4. ローカルLLM(llama-server)の管理

LLMのステータス(Running/Stopped)を監視し、ワンクリックで起動・停止するスクリプト。

  • ポイント1:PIDファイルの隠しファイル化: SwiftBarはディレクトリ内の全ファイルを実行しようとするため、PIDファイル(.llama-server.pid)の先頭にドットを付けて無視させる。これで「はてなマーク」の発生を防ぐ。

  • ポイント2:フルパスの指定: GUIアプリであるSwiftBarから実行する場合、環境変数や相対パス($0)が不安定になるため、スクリプト内で SELF_PATH を定義し、絶対パスで自分自身を呼び出すように設計。

5. トラブルシューティング:なぜ「はてなマーク」が出るのか?

エンジニアとしてハマりやすいポイントの解説。

  • 原因: SwiftBarがスクリプトではないファイル(PIDファイルやバックアップファイル)を読み込もうとしてエラーを吐く。

  • 対策: ディレクトリ内の不要なファイルを削除(rm llama-server.pid)し、一時ファイルは必ずドットから始まる名前にする。

6. まとめ

  • M4 Maxの広大なメモリを、指先ひとつでいつでもリフレッシュできる最強の環境が完成。

  • シェルスクリプトという「古くて新しい道具」を、SwiftBarのような現代のツールと組み合わせる楽しさ。


AIツール断捨離の果てに

  導入 ハード環境 : Mac Studio M4 Maxの導入。 背景 : 以前から使い倒してきたITエンジニアとして、話題のAIツール(Cursor, Zed, Void, Continue, Roo Codeなど)を片っ端から実戦投入してみたこと。 目的 : ツールをいじ...