2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gemini CLIを使って並列タスク処理をしたい!(下準備編)

Last updated at Posted at 2025-07-02

はじめに

環境

  • PC: MacBook Air(16 GM)
  • 開発環境: vscode

元ネタ

note AI駆動開発 Claude Code & Tmux入門 16ワーカーを同時に動かして開発効率爆上げする方法 bashもzshにも対応

背景

Gemini CLIを使って並列実行処理でタスクをさせてみたい!!と思いました。

この記事では、その下準備としてtmux を使ってターミナルをグリッド状に分割し、さらに自作のシェルスクリプト(zshエイリアス)を使って、分割した全ペインまたは特定のペイン群を自在に操作する環境を構築する方法を解説します。

この記事で実現できること

ざっくり

  1. N x N の tmux グリッドレイアウト自動生成: create_tmux_layout.sh で、好きなサイズのペイン群を一瞬で作成します。
  2. コマンド一括実行: ta, tb, tw といった2文字のショートカットで、全ペイン、特定グループ(Boss/Worker)のペインに同じコマンドを送信します。
  3. セッション管理の効率化: セッションの起動、状態確認、終了を簡単に行うコマンドを整備します。

デモ

下記記事を設定し、以下コマンドを打つと、ターミナルが分割します。
以下画像は、N=2と設定した場合。

./create_tmux_layout.sh <N>

スクリーンショット 2025-07-02 21.16.52.png

pane-R1C1で以下のコマンドを打つと、下記画像のように全部のターミナルにhelloと表示されます。

ta "echo hello"

スクリーンショット 2025-07-02 21.19.37.png

元ネタと異なる点

  • ターミナルの分割を動的にしました
    • 44⇨NN
    • ただし、ショートカットキーの改善はまだ
  • ショートカットきーの設定に、現在のtmuxセッションを終了するコマンドを追加しました

ファイル構成

.
├── .zshrc
└── Parallel-Processing-With-CLI/ # お好みの適当なフォルダ名
    ├── create_tmux_layout.sh
    └── README.md

Step 1: tmux グリッドレイアウトの自動生成

まずは、並列処理の土台となる tmux のペインを自動で生成するスクリプトです。

tmuxのインストール

brew install tmux

create_tmux_layout.sh

指定した数 N に基づき、tmux ウィンドウ内に N x N のペイン(画面)を生成し、各ペインに識別用の名前とプロンプトを設定します。

セットアップ

スクリプトに実行権限を付与します。この操作は初回のみ必要です。

chmod +x create_tmux_layout.sh

実行方法

create_tmux_layout.shファイルを作成します。

# create_tmux_layout.sh
#!/bin/bash

# tmuxでNxNのペイン構成を作成するスクリプト
# 使用方法: ./create_tmux_grid_arg.sh <N>
# 例: ./create_tmux_grid_arg.sh 3 で3x3のペインを作成

# --- 引数のチェック ---
if [ -z "$1" ]; then
    echo "使用方法: $0 <N>"
    echo "例: $0 4 で4x4のペインを作成します。"
    exit 1
fi

N=$1 # コマンドライン引数の最初の値をNに設定
SESSION_NAME="multagent_testtm" # セッション名にNを含める。ショートカットキーで設定するSESSIONと一緒

# --- 既存のセッションがある場合は削除 ---
tmux has-session -t "$SESSION_NAME" 2>/dev/null && tmux kill-session -t "$SESSION_NAME"

# --- 新しいセッションを作成 ---
tmux new-session -d -s "$SESSION_NAME"

# 最初のペインの名前を設定
tmux rename-window -t "$SESSION_NAME":0 "multiagent_window"

# --- 縦方向にN-1回分割してN行にする ---
# 最初のペイン (0.0) を基準に縦に分割していく
for ((i=1; i<N; i++)); do
    tmux split-window -v -t "$SESSION_NAME":0.0
done

# --- 各行を横方向にN-1回分割してN列にする ---
# 各行の最初のペインを選択し、そこから横に分割していく
for ((row=0; row<N; row++)); do
    # 各行の最初のペインのインデックスを計算
    initial_pane_index=$((row * N))
    
    # その行の最初のペインに移動
    tmux select-pane -t "$SESSION_NAME":0."$initial_pane_index"

    # 現在選択されているペインを横にN-1回分割
    for ((col=1; col<N; col++)); do
        tmux split-window -h
    done
done

# --- 各ペインにタイトルを設定し、プロンプトをカスタマイズ ---
# ペインの総数
TOTAL_PANES=$((N * N))

for ((i=0; i<TOTAL_PANES; i++)); do
    row=$((i / N)) # 現在のペインの行番号 (0からN-1)
    col=$((i % N)) # 現在のペインの列番号 (0からN-1)
    
    # ペイン名を生成 (例: pane-R0C0, pane-R0C1, ...)
    pane_name="pane-R${row}C${col}"
    
    # ペインにタイトルを設定
    tmux send-keys -t "$SESSION_NAME":0."$i" "printf '\033]2;${pane_name}\033\\'" C-m
    
    # プロンプトにペイン名を表示
    tmux send-keys -t "$SESSION_NAME":0."$i" "export PS1='(${pane_name}) \$ '" C-m
    
    # 画面をクリア
    tmux send-keys -t "$SESSION_NAME":0."$i" "clear" C-m
done

# --- レイアウトを調整(均等に配置) ---
tmux select-layout -t "$SESSION_NAME":0 tiled

# --- セッションにアタッチ ---
tmux attach-session -t "$SESSION_NAME"

echo "tmuxセッション '$SESSION_NAME' が作成されました。"
echo "${N}x${N}のペイン構成で、合計${TOTAL_PANES}個のペインがあります。"
echo "各ペインは 'pane-R[行番号]C[列番号]' の形式で命名されています。"

実行コマンド

./create_tmux_layout.sh <N>

<N> には、生成したいグリッドのサイズ(例: 4 なら 4x4=16ペイン)を指定します。


Step 2: .zshrc にコマンドエイリアスを追加

次に、.zshrc に便利なエイリアスを追加して、tmux ペインの操作を効率化します。これにより、コマンドラインから直接、複数のペインをコントロールできるようになります。

.zshrc 設定の概要

以下は、.zshrc に追加する設定の要約です。

  • 基本設定: 操作対象となる tmux のセッション名を定義します。
  • メインコマンド (2文字): ta (全ペイン), tb (ボスペイン), tw (ワーカーペイン) でコマンドやEnterキーを送信します。
  • 便利コマンド: tc (クリア), ts (状態確認), end (セッション終了), tk (現在セッション終了) など。
  • ヘルプ機能: th で、定義したコマンドの一覧と使用例を表示します。

.zshrc に下記コードを追加する

#################### 以下がCLIの並列処理をするために追加した内容 ####################



# 現在のtmuxセッションを終了するためのエイリアス
alias kill_this_session='tmux kill-session -t $(tmux display-message -p "#S")'

# ~/.zshrc に追加するシンプルな2文字 tmux コマンド

# ===========================================
# 基本設定
# ===========================================

# セッション名(必要に応じて変更)
SESSION="multagent_testtm" # ここは後の.ashrcの設定と同じにすること

# ===========================================
# メインコマンド(2文字)
# ===========================================

# ta "command" - 全ペイン(Total/All)
alias ta='function _ta(){ 
    if [[ -z "$1" ]]; then
        # 引数なし = ENTERキーのみ送信
        for i in {0..15}; do 
            tmux send-keys -t "$SESSION:0.$i" C-m
        done
        echo "✅ 全ペインにENTERを送信しました"
    else
        # 引数あり = コマンド + ENTER送信
        for i in {0..15}; do 
            tmux send-keys -t "$SESSION:0.$i" "$1" C-m
        done
        echo "✅ 全ペインで実行: $1"
    fi
}; _ta'

# tb "command" - ボスペイン(Boss)
alias tb='function _tb(){ 
    if [[ -z "$1" ]]; then
        # 引数なし = ENTERキーのみ送信
        for i in 0 4 8 12; do 
            tmux send-keys -t "$SESSION:0.$i" C-m
        done
        echo "✅ ボスペインにENTERを送信しました"
    else
        # 引数あり = コマンド + ENTER送信
        for i in 0 4 8 12; do 
            tmux send-keys -t "$SESSION:0.$i" "$1" C-m
        done
        echo "✅ ボスペインで実行: $1"
    fi
}; _tb'

# tw "command" - ワーカーペイン(Worker)
alias tw='function _tw(){ 
    if [[ -z "$1" ]]; then
        # 引数なし = ENTERキーのみ送信
        for i in {1..3} {5..7} {9..11} {13..15}; do 
            tmux send-keys -t "$SESSION:0.$i" C-m
        done
        echo "✅ ワーカーペインにENTERを送信しました"
    else
        # 引数あり = コマンド + ENTER送信
        for i in {1..3} {5..7} {9..11} {13..15}; do 
            tmux send-keys -t "$SESSION:0.$i" "$1" C-m
        done
        echo "✅ ワーカーペインで実行: $1"
    fi
}; _tw'

# ===========================================
# 便利な追加コマンド
# ===========================================

# tc - 全ペインでクリア(Clear)
alias tc='ta "clear"'

# ts - セッション状況確認(Status)
alias ts='function _ts(){
    echo "=== TMux セッション状況 ==="
    echo "セッション名: $SESSION"
    if tmux has-session -t "$SESSION" 2>/dev/null; then
        echo "✅ セッション '$SESSION' は実行中"
        pane_count=$(tmux list-panes -t "$SESSION" 2>/dev/null | wc -l)
        echo "📊 ペイン数: $pane_count"
    else
        echo "❌ セッション '$SESSION' が見つかりません"
    fi
}; _ts'

# end - セッション終了
alias end='function _end(){
    echo "🛑 セッション '$SESSION' を終了中..."
    tmux has-session -t "$SESSION" 2>/dev/null && tmux kill-session -t "$SESSION" || echo "❌ セッションが見つかりません"
    if ! tmux has-session -t "$SESSION" 2>/dev/null; then
        echo "✅ セッション '$SESSION' を終了しました"
    fi
}; _end'

# <<<<<<<<<<<<<<< ここから追加 >>>>>>>>>>>>>>>
# tk - 現在のtmuxセッションを終了(Kill This Session)
alias tk='kill_this_session'
# <<<<<<<<<<<<<<< ここまで追加 >>>>>>>>>>>>>>>

# ===========================================
# 使用例とヘルプ
# ===========================================

# ヘルプ表示
alias th='function _th(){
    echo "=== シンプル tmux コマンド ==="
    echo ""
    echo "基本コマンド:"
    echo "  ta \"コマンド\"  - 全ペイン(16個全部)で実行"
    echo "  tb \"コマンド\"  - ボスペイン(4個)で実行"  
    echo "  tw \"コマンド\"  - ワーカーペイン(12個)で実行"
    echo ""
    echo "ENTERキーのみ送信:"
    echo "  ta              - 全ペインでENTER"
    echo "  tb              - ボスペインでENTER"
    echo "  tw              - ワーカーペインでENTER"
    echo ""
    echo "便利コマンド:"
    echo "  tc              - 全ペインでclear"
    echo "  ts              - セッション状況確認"
    echo "  end             - セッション終了"
    echo "  tk              - 現在のセッションを終了" # ヘルプに追記
    echo ""
    echo "コマンド例:"
    echo "  ta \"npm start\"     # 全ペインでnpm start"
    echo "  tb \"git status\"    # ボスペインでgit status"
    echo "  tw \"clear\"         # ワーカーペインでclear"
    echo "  ta \"cd /project\"   # 全ペインでディレクトリ移動"
    echo ""
    echo "ENTER使用例:"
    echo "  ta \"sudo apt update\"  # コマンド入力"
    echo "  ta                     # ENTERで実行"
    echo ""
    echo "  tw \"npm init\"        # 質問が表示される"
    echo "  tw                     # デフォルト値でENTER"
    echo ""
    echo "セッション: $SESSION"
    echo "💡 ペイン構成: Boss(0,4,8,12) + Worker(1-3,5-7,9-11,13-15)"
}; _th'

# ===========================================
# よく使うパターンの例
# ===========================================

# 開発環境セットアップ例
alias dev-start='function _dev_start(){
    echo "🚀 開発環境を起動中..."
    ta "cd /project"
    sleep 1
    tb "npm run dev"
    tw "npm run worker"
    echo "✅ 開発環境起動完了!"
}; _dev_start'

# 全停止
alias dev-stop='function _dev_stop(){
    echo "🛑 開発環境を停止中..."
    ta "^C"  # Ctrl+C
    sleep 1
    tc       # clear
    echo "✅ 停止完了"
}; _dev_stop'

# 初回メッセージ
echo "✅ 改良版シンプル tmux コマンドが読み込まれました!"
echo "💡 使い方: th でヘルプ表示"
echo "🚀 便利機能: tc(クリア) ts(状況確認) end(セッション終了) tk(現在のセッション終了) dev-start(開発開始)" # 初回メッセージに追記

設定の反映

.zshrc を編集した後、以下のコマンドで設定を再読み込みします。

source ~/.zshrc

Step 3: テスト

1. 4x4 の開発環境を起動

# 16個のペインを持つtmuxセッションを開始
./create_tmux_layout.sh 4

2. 全ペインで一斉にコマンド実行

# 全ペインでhelloと言わせる
ta "echo hello"

3. クリーンアップと終了

# 全ペインの画面をクリア
tc

# 現在のtmuxセッションを終了
tk

まとめ

tmux.zshrc のカスタムエイリアスを組み合わせることで、CLIにおける並列処理のセットアップと操作を劇的に効率化できます。

今回紹介したスクリプトと設定をベースに、ご自身の開発スタイルに合わせてカスタマイズしてみてください。

最後に

記事の80%をGemini CLIで書きました

2
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?