jpskill.com
🛠️ 開発・MCP コミュニティ

tmux-processes

開発サーバーや監視ツールなど、長時間実行されるプロセスをtmux内で管理するためのパターンを提供するSkillです。

📜 元の英語説明(参考)

Patterns for running long-lived processes in tmux. Use when starting dev servers, watchers, tilt, or any process expected to outlive the conversation.

🇯🇵 日本人クリエイター向け解説

一言でいうと

開発サーバーや監視ツールなど、長時間実行されるプロセスをtmux内で管理するためのパターンを提供するSkillです。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o tmux-processes.zip https://jpskill.com/download/5892.zip && unzip -o tmux-processes.zip && rm tmux-processes.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/5892.zip -OutFile "$d\tmux-processes.zip"; Expand-Archive "$d\tmux-processes.zip" -DestinationPath $d -Force; ri "$d\tmux-processes.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して tmux-processes.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → tmux-processes フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-17
取得日時
2026-05-17
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

[Skill 名] tmux-processes

tmux プロセス管理

対話型シェル要件

信頼性の高いシェル初期化には send-keys パターンを使用してください。 セッションを作成すると、対話型シェルが自動的に起動します。そのシェル内でコマンドを実行するには send-keys を使用し、PATH、direnv、およびその他の初期化が適切に実行されるようにしてください。

# WRONG - インラインコマンドはシェル初期化をバイパスし、PATH/direnv を壊します
tmux new-session -d -s "$SESSION" -n main 'tilt up'

# CORRECT - セッションを作成し、対話型シェルにコマンドを送信します
tmux new-session -d -s "$SESSION" -n main
tmux send-keys -t "$SESSION:main" 'tilt up' Enter

セッション命名規則

セッション名は常にプロジェクトから派生させてください。

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

1つのプロジェクトで複数のプロセスを使用する場合は、個別のセッションではなくウィンドウを使用してください。

  • セッション: myapp
  • ウィンドウ: servertestslogs

プロセスの開始

単一プロセス

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# 名前付きウィンドウでセッションを作成し、コマンドを送信します
tmux new-session -d -s "$SESSION" -n main
tmux send-keys -t "$SESSION:main" '<command>' Enter

冪等な開始

開始する前に、すでに実行中であるかを確認してください。

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

if ! tmux has-session -t "$SESSION" 2>/dev/null; then
  tmux new-session -d -s "$SESSION" -n main
  tmux send-keys -t "$SESSION:main" '<command>' Enter
else
  echo "Session $SESSION already exists"
fi

既存のセッションへのウィンドウの追加

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# 存在しない場合は新しいウィンドウを追加します
if ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$"; then
  tmux new-window -t "$SESSION" -n server
  tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
else
  echo "Window 'server' already exists"
fi

複数プロセス (ウィンドウ)

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# 最初のプロセスでセッションを作成します
tmux new-session -d -s "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter

# さらにウィンドウを追加します
tmux new-window -t "$SESSION" -n tests
tmux send-keys -t "$SESSION:tests" 'npm run test:watch' Enter

tmux new-window -t "$SESSION" -n logs
tmux send-keys -t "$SESSION:logs" 'tail -f logs/app.log' Enter

出力の監視

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# 最初のウィンドウからの最後の50行
tmux capture-pane -p -t "$SESSION" -S -50

# 特定のウィンドウから
tmux capture-pane -p -t "$SESSION:server" -S -50

# エラーの確認
tmux capture-pane -p -t "$SESSION" -S -100 | rg -i "error|fail|exception"

# 準備完了インジケーターの確認
tmux capture-pane -p -t "$SESSION:server" -S -50 | rg -i "listening|ready|started"

ライフサイクル管理

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# すべてのセッションを一覧表示します (何が存在するかを確認します)
tmux ls

# 現在のセッションのウィンドウを一覧表示します
tmux list-windows -t "$SESSION"

# このプロジェクトのセッションのみを終了します
tmux kill-session -t "$SESSION"

# 特定のウィンドウを終了します
tmux kill-window -t "$SESSION:tests"

# ウィンドウにキーを送信します (例: 停止するために Ctrl+C)
tmux send-keys -t "$SESSION:server" C-c

隔離ルール

  • tmux kill-server決して使用しないでください。
  • 現在のプロジェクトと一致しないセッションは決して終了しないでください。
  • セッション名は常に git ルートまたは pwd から派生させてください。
  • 終了操作の前にセッション名を常に確認してください。
  • 他の Claude Code インスタンスが独自のセッションを実行している場合があります。

tmux を使用するタイミング

シナリオ tmux を使用しますか?
tilt up はい、常に
開発サーバー (npm run dev, rails s) はい
ファイルウォッチャー (npm run watch) はい
テストウォッチャー (npm run test:watch) はい
データベースサーバー はい
ワンショットビルド (npm run build) いいえ
クイックコマンド (<10秒) いいえ
会話で直接 stdout が必要 いいえ

プロセスステータスの確認

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# セッションが存在するか確認します
tmux has-session -t "$SESSION" 2>/dev/null && echo "session exists" || echo "no session"

# ウィンドウとそのステータスを一覧表示します
tmux list-windows -t "$SESSION" -F '#{window_name}: #{pane_current_command}'

# 特定のウィンドウが存在するか確認します
tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$" && echo "server window exists"

プロセスの再起動

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# Ctrl+C を送信してからコマンドを再起動します
tmux send-keys -t "$SESSION:server" C-c
sleep 1
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter

一般的なパターン

実行中でない場合は開発サーバーを起動する

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

if ! tmux has-session -t "$SESSION" 2>/dev/null; then
  tmux new-session -d -s "$SESSION" -n server
  tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
  echo "Started dev server in tmux session: $SESSION"
elif ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$"; then
  tmux new-window -t "$SESSION" -n server
  tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
  echo "Added server window to session: $SESSION"
else
  echo "Server already running in session: $SESSION"
fi

サーバーの準備完了を待つ

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# 準備完了メッセージをポーリングします
for i in {1..30}; do
  if tmux capture-pane -p -t "$SESSION:server" -S -20 | rg -q "listening|ready"; then
    echo "Server ready"
    break
  fi
  sleep 1
done
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

tmux Process Management

Interactive Shell Requirement

Use send-keys pattern for reliable shell initialization. Creating a session spawns an interactive shell automatically. Use send-keys to run commands within that shell, ensuring PATH, direnv, and other initialization runs properly.

# WRONG - inline command bypasses shell init, breaks PATH/direnv
tmux new-session -d -s "$SESSION" -n main 'tilt up'

# CORRECT - create session, then send command to interactive shell
tmux new-session -d -s "$SESSION" -n main
tmux send-keys -t "$SESSION:main" 'tilt up' Enter

Session Naming Convention

Always derive session name from the project:

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

For multiple processes in one project, use windows not separate sessions:

  • Session: myapp
  • Windows: server, tests, logs

Starting Processes

Single Process

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# Create session with named window, then send command
tmux new-session -d -s "$SESSION" -n main
tmux send-keys -t "$SESSION:main" '<command>' Enter

Idempotent Start

Check if already running before starting:

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

if ! tmux has-session -t "$SESSION" 2>/dev/null; then
  tmux new-session -d -s "$SESSION" -n main
  tmux send-keys -t "$SESSION:main" '<command>' Enter
else
  echo "Session $SESSION already exists"
fi

Adding Windows to Existing Session

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# Add a new window if it doesn't exist
if ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$"; then
  tmux new-window -t "$SESSION" -n server
  tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
else
  echo "Window 'server' already exists"
fi

Multiple Processes (Windows)

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# Create session with first process
tmux new-session -d -s "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter

# Add more windows
tmux new-window -t "$SESSION" -n tests
tmux send-keys -t "$SESSION:tests" 'npm run test:watch' Enter

tmux new-window -t "$SESSION" -n logs
tmux send-keys -t "$SESSION:logs" 'tail -f logs/app.log' Enter

Monitoring Output

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# Last 50 lines from first window
tmux capture-pane -p -t "$SESSION" -S -50

# From specific window
tmux capture-pane -p -t "$SESSION:server" -S -50

# Check for errors
tmux capture-pane -p -t "$SESSION" -S -100 | rg -i "error|fail|exception"

# Check for ready indicators
tmux capture-pane -p -t "$SESSION:server" -S -50 | rg -i "listening|ready|started"

Lifecycle Management

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# List all sessions (see what exists)
tmux ls

# List windows in current session
tmux list-windows -t "$SESSION"

# Kill only this project's session
tmux kill-session -t "$SESSION"

# Kill specific window
tmux kill-window -t "$SESSION:tests"

# Send keys to a window (e.g., Ctrl+C to stop)
tmux send-keys -t "$SESSION:server" C-c

Isolation Rules

  • Never use tmux kill-server
  • Never kill sessions not matching current project
  • Always derive session name from git root or pwd
  • Always verify session name before kill operations
  • Other Claude Code instances may have their own sessions running

When to Use tmux

Scenario Use tmux?
tilt up Yes, always
Dev server (npm run dev, rails s) Yes
File watcher (npm run watch) Yes
Test watcher (npm run test:watch) Yes
Database server Yes
One-shot build (npm run build) No
Quick command (<10s) No
Need stdout directly in conversation No

Checking Process Status

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# Check session exists
tmux has-session -t "$SESSION" 2>/dev/null && echo "session exists" || echo "no session"

# List windows and their status
tmux list-windows -t "$SESSION" -F '#{window_name}: #{pane_current_command}'

# Check if specific window exists
tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$" && echo "server window exists"

Restarting a Process

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# Send Ctrl+C then restart command
tmux send-keys -t "$SESSION:server" C-c
sleep 1
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter

Common Patterns

Start dev server if not running

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

if ! tmux has-session -t "$SESSION" 2>/dev/null; then
  tmux new-session -d -s "$SESSION" -n server
  tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
  echo "Started dev server in tmux session: $SESSION"
elif ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$"; then
  tmux new-window -t "$SESSION" -n server
  tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
  echo "Added server window to session: $SESSION"
else
  echo "Server already running in session: $SESSION"
fi

Wait for server ready

SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)

# Poll for ready message
for i in {1..30}; do
  if tmux capture-pane -p -t "$SESSION:server" -S -20 | rg -q "listening|ready"; then
    echo "Server ready"
    break
  fi
  sleep 1
done