Bên trong tmux, thông báo desktop của Claude Code sẽ không bao giờ đến được terminal bên ngoài cho tới khi bạn thêm set -g allow-passthrough on vào ~/.tmux.conf. Cách này giải quyết vấn đề khi bạn đang attach. Khi đã detach, không còn terminal nào hiển thị phiên đó nên không gì trên màn hình có thể báo cho bạn, nhưng Claude Code vẫn chạy và hook vẫn được kích hoạt. Để nhận tin từ phiên đã detach, hãy dùng hook gửi push qua mạng, tới điện thoại hoặc ứng dụng chat, thay vì hook phụ thuộc vào terminal.
01Khi attach: cho thông báo đi qua tmux
tmux nằm giữa Claude Code và terminal của bạn, và mặc định sẽ nuốt mất các escape sequence mà Claude Code dùng cho thông báo desktop. Hướng dẫn terminal của Anthropic đưa ra đoạn cấu hình sau cho ~/.tmux.conf:
set -g allow-passthrough on
set -g focus-events on
set -s extended-keys on
set -as terminal-features 'xterm*:extkeys'
Áp dụng cho server đang chạy:
tmux source-file ~/.tmux.conf
allow-passthrough cho phép thông báo và cập nhật tiến độ đến được terminal bên ngoài. Các dòng còn lại sửa Shift+Enter để xuống dòng. Sau khi cấu hình, những terminal hiển thị thông báo của Claude Code bên ngoài tmux (Ghostty, Kitty, và iTerm2 khi đã bật cảnh báo) cũng sẽ hiển thị chúng bên trong tmux.
Điều tương tự áp dụng cho các hook trả về terminalSequence. Tài liệu tham khảo hook của Anthropic cho biết Claude Code tự ghi các sequence này, nên chúng hoạt động được trong tmux và GNU screen. Các hướng dẫn cho macOS, Linux và SSH có ví dụ cụ thể.
02Đang attach nhưng ở window khác: dùng bell
Nếu Claude Code chạy ở một window tmux còn bạn làm việc ở window khác, bell là tín hiệu đơn giản. Hãy bảo Claude Code luôn gửi bell:
{
"preferredNotifChannel": "terminal_bell"
}
Sau đó cấu hình tmux phản hồi lại, trong ~/.tmux.conf:
setw -g monitor-bell on
set -g bell-action other
set -g visual-bell off
monitor-bell (bật mặc định) đánh dấu window vừa rung bell, và tmux hiển thị ! cho window đó trên thanh trạng thái. bell-action other chuyển bell từ các window khác window bạn đang xem sang terminal, để terminal có thể kêu bíp hoặc nhảy icon. Dùng any để tính cả window hiện tại. Đặt visual-bell thành on sẽ hiện thông báo trong tmux thay vì chuyển bell đi.
03Cho biết phiên nào đang cần bạn
Khi chạy nhiều phiên cùng lúc, một thông báo chỉ ghi "Claude cần bạn" thì chẳng giúp được mấy. Hook chạy trong môi trường của pane, nên nó có thể hỏi tmux tên session và window. Ví dụ trên Linux sau hiển thị chúng trong thông báo desktop:
#!/bin/bash
msg=$(jq -r '.message // "Claude Code needs your attention"')
where=""
if [ -n "$TMUX_PANE" ]; then
where=$(tmux display-message -p -t "$TMUX_PANE" '#S:#W')
fi
notify-send "Claude Code ${where}" "$msg"
Lưu file thành ~/.claude/hooks/notify-tmux.sh, chạy chmod +x cho nó và dùng làm lệnh cho hook Notification hoặc Stop. #S là tên session và #W là tên window; đặt tên session bằng tmux new -s api-refactor và thông báo sẽ cho bạn biết cần đến đâu. Thay notify-send bằng lệnh tương ứng trên nền tảng của bạn, hoặc bằng push. Hướng dẫn nhiều phiên có thêm cách phân biệt các phiên.
04Khi detach: bạn cần push
Detach là mục đích chính của tmux: bạn khởi động một tác vụ dài, detach rồi đi. Claude Code vẫn tiếp tục làm việc trong phiên đã detach. Nhưng lúc này không còn terminal nào để hiển thị escape sequence hay bell, và nếu tmux server được khởi động qua SSH thì lệnh thông báo desktop cũng có thể không có chỗ nào để hiện.
Hook gửi request qua mạng thì không quan tâm có ai đang attach hay không. Dịch vụ push nào cũng được. Hướng dẫn ntfy và hướng dẫn Telegram, Slack và Discord có sẵn hook để bạn dán vào. Các cách này chỉ báo cho bạn biết có chuyện xảy ra; chúng không thể trả lời Claude, nên prompt xin quyền vẫn phải chờ đến khi bạn attach lại bằng tmux attach -t api-refactor.
05Claude Code Notifier nằm ở đâu trong bức tranh này
Claude Code Notifier là công cụ độc lập (do TouchTap phát triển, không phải Anthropic) được xây dựng trên hook của Claude Code. Công cụ dòng lệnh miễn phí của nó, ccn, chạy trên Mac, Windows và Linux. Vì nó gắn vào Claude Code chứ không gắn vào terminal, nó hoạt động như nhau trong tmux, screen hay shell thông thường, dù attach hay detach:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
Trên máy desktop, nó hiển thị thông báo desktop khi Claude làm xong, cần cấp quyền hoặc đặt câu hỏi. Ghép nối điện thoại và các sự kiện đó sẽ đến dưới dạng push notification qua relay mã hóa của TouchTap, từ bất kỳ máy nào chạy ccn, kể cả server bạn truy cập qua SSH.
Điện thoại lấp đầy khoảng trống mà phiên detach để lại. Khi có yêu cầu cấp quyền, bạn có thể cho phép một lần, cho phép trong cả phiên hoặc từ chối ngay trên điện thoại, và Claude tiếp tục làm việc mà bạn không cần attach lại. Bạn có thể chọn câu trả lời khi Claude đặt câu hỏi, và gửi chỉ dẫn tiếp theo ngay khi Claude làm xong. Nếu bạn vừa gõ phím trong 30 giây gần nhất, sẽ không có gì chờ điện thoại và terminal hỏi như bình thường. Nếu bạn vắng mặt, terminal sẽ chờ câu trả lời từ điện thoại, tối đa đến mức bạn chọn (hold_ceiling_seconds), và dừng chờ ngay khi bạn chạm vào bàn phím.
Xem ghép nối điện thoại, rời máy khi chạy tác vụ dài và trang ccn. Ứng dụng điện thoại cần gói đăng ký hoặc mua trọn đời; xem bảng giá.
06GNU screen
Về chuyện này, screen hoạt động khá giống tmux. Tài liệu tham khảo hook của Anthropic cho biết output terminalSequence của hook hoạt động trong screen, và screen hiển thị thông báo khi một window bạn không xem rung bell. Phiên screen đã detach cũng gặp vấn đề giống tmux đã detach: không có gì trên màn hình, nên hãy dùng push.
07Câu hỏi thường gặp
Tại sao thông báo của Claude Code không hiện trong tmux?
tmux chặn các escape sequence mà Claude Code dùng, trừ khi bật passthrough. Thêm set -g allow-passthrough on vào ~/.tmux.conf rồi chạy tmux source-file ~/.tmux.conf.
Claude Code có tiếp tục chạy khi tôi detach khỏi tmux không?
Có. Tiến trình vẫn chạy trong tmux server và các hook vẫn được kích hoạt. Chỉ những thông báo cần terminal đang attach mới không đến được bạn.
Làm sao để nhận thông báo từ một session tmux đã detach?
Dùng hook gửi push qua mạng, chẳng hạn ntfy, webhook của ứng dụng chat hoặc ứng dụng điện thoại của Claude Code Notifier. Escape sequence và tiếng bell của terminal đều cần một client đang attach.
Tôi có thể duyệt quyền mà không cần attach lại không?
Với dịch vụ push thông thường thì không. Với Claude Code Notifier và một điện thoại đã ghép nối, bạn có thể cho phép hoặc từ chối yêu cầu ngay trên điện thoại và session đã detach sẽ tiếp tục chạy.
Làm sao biết session tmux nào đang cần mình?
Đặt tên cho các session và đưa tên đó vào thông báo. Hook có thể đọc tên bằng tmux display-message -p -t "$TMUX_PANE" '#S:#W'.