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本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
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
$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. 下の青いボタンを押して
tmux-processes.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
tmux-processesフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
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 - ウィンドウ:
server、tests、logs
プロセスの開始
単一プロセス
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