tmux-processes

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

tmux Process Management

tmux 进程管理

Interactive Shell Requirement

交互式Shell要求

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.
bash
undefined
使用send-keys模式确保Shell初始化可靠。 创建会话时会自动生成一个交互式Shell。使用
send-keys
在该Shell中运行命令,确保PATH、direnv和其他初始化步骤正常执行。
bash
undefined

WRONG - inline command bypasses shell init, breaks PATH/direnv

WRONG - inline command bypasses shell init, breaks PATH/direnv

tmux new-session -d -s "$SESSION" -n main 'tilt up'
tmux new-session -d -s "$SESSION" -n main 'tilt up'

CORRECT - create session, then send command to interactive shell

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
undefined
tmux new-session -d -s "$SESSION" -n main tmux send-keys -t "$SESSION:main" 'tilt up' Enter
undefined

Session Naming Convention

会话命名规范

Always derive session name from the project:
bash
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
始终从项目派生会话名称:
bash
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
对于一个项目中的多个进程,使用窗口而非单独会话:
  • 会话:
    myapp
  • 窗口:
    server
    ,
    tests
    ,
    logs

Starting Processes

启动进程

Single Process

单个进程

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

Create session with named window, then send command

Create session with named window, then send command

tmux new-session -d -s "$SESSION" -n main tmux send-keys -t "$SESSION:main" '<command>' Enter
undefined
tmux new-session -d -s "$SESSION" -n main tmux send-keys -t "$SESSION:main" '<command>' Enter
undefined

Idempotent Start

幂等启动

Check if already running before starting:
bash
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
启动前检查是否已在运行:
bash
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

向现有会话添加窗口

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

Add a new window if it doesn't exist

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

Multiple Processes (Windows)

多进程(多窗口)

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

Create session with first process

Create session with first process

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

Add more windows

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

Monitoring Output

监控输出

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

Last 50 lines from first window

Last 50 lines from first window

tmux capture-pane -p -t "$SESSION" -S -50
tmux capture-pane -p -t "$SESSION" -S -50

From specific window

From specific window

tmux capture-pane -p -t "$SESSION:server" -S -50
tmux capture-pane -p -t "$SESSION:server" -S -50

Check for errors

Check for errors

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

Check for ready indicators

Check for ready indicators

tmux capture-pane -p -t "$SESSION:server" -S -50 | rg -i "listening|ready|started"
undefined
tmux capture-pane -p -t "$SESSION:server" -S -50 | rg -i "listening|ready|started"
undefined

Lifecycle Management

生命周期管理

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

List all sessions (see what exists)

List all sessions (see what exists)

tmux ls
tmux ls

List windows in current session

List windows in current session

tmux list-windows -t "$SESSION"
tmux list-windows -t "$SESSION"

Kill only this project's session

Kill only this project's session

tmux kill-session -t "$SESSION"
tmux kill-session -t "$SESSION"

Kill specific window

Kill specific window

tmux kill-window -t "$SESSION:tests"
tmux kill-window -t "$SESSION:tests"

Send keys to a window (e.g., Ctrl+C to stop)

Send keys to a window (e.g., Ctrl+C to stop)

tmux send-keys -t "$SESSION:server" C-c
undefined
tmux send-keys -t "$SESSION:server" C-c
undefined

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
  • 绝对不要使用
    tmux kill-server
  • 绝对不要终止与当前项目不匹配的会话
  • 始终从Git根目录或当前工作目录派生会话名称
  • 始终在执行终止操作前验证会话名称
  • 其他Claude Code实例可能在运行各自的会话

When to Use tmux

何时使用tmux

ScenarioUse 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 serverYes
One-shot build (
npm run build
)
No
Quick command (<10s)No
Need stdout directly in conversationNo
场景是否使用tmux?
tilt up
是,始终使用
开发服务器(
npm run dev
,
rails s
文件监视器(
npm run watch
测试监视器(
npm run test:watch
数据库服务器
一次性构建(
npm run build
快速命令(<10秒)
需要直接在会话中查看标准输出

Checking Process Status

检查进程状态

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

Check session exists

Check session exists

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

List windows and their status

List windows and their status

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

Check if specific window exists

Check if specific window exists

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

Restarting a Process

重启进程

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

Send Ctrl+C then restart command

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
undefined
tmux send-keys -t "$SESSION:server" C-c sleep 1 tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
undefined

Common Patterns

常见模式

Start dev server if not running

若未运行则启动开发服务器

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

等待服务器就绪

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

Poll for ready message

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