Vấn đề: Terminal bị treo
Bạn đang tập trung vào một tác vụ cấu hình, tạm rời đi để uống cà phê trong năm phút và khi quay lại thì thấy terminal hoàn toàn không phản hồi. Sau vài giây gõ phím trong vô vọng, thông báo đáng sợ sau sẽ xuất hiện:
packet_write_wait: Connection to 192.168.1.100 port 22: Broken pipe
Đây không chỉ là một sự phiền toái nhỏ. Nó làm gián đoạn luồng công việc, làm dừng các tiến trình đang chạy và buộc bạn phải xác thực lại cũng như điều hướng lại từ đầu đến thư mục đang làm việc.
Tại sao lỗi "Broken pipe" lại xảy ra?
Lỗi Broken pipe xảy ra khi máy khách SSH cố gắng gửi dữ liệu qua một kết nối mà phía bên kia — hoặc một thiết bị trung gian — đã đóng. Điều này thường bắt nguồn từ một trong ba vấn đề sau:
- Quy tắc Firewall nghiêm ngặt: Nhiều firewall của doanh nghiệp hoặc router NAT gia đình sẽ tự động loại bỏ các kết nối "ngủ đông" (idle) khỏi bộ nhớ sau 300 giây (5 phút) để tiết kiệm tài nguyên.
- Thời gian chờ (Timeout) phía máy chủ: Để đảm bảo bảo mật, máy chủ từ xa có thể được cấu hình để ngắt kết nối những người dùng không có hoạt động trong một khoảng thời gian nhất định.
- Biến động mạng: Nếu Wi-Fi chập chờn hoặc VPN chuyển đổi máy chủ, địa chỉ IP cục bộ của bạn có thể thay đổi, ngay lập tức làm mất hiệu lực socket TCP hiện có.
Cách khắc phục
Cách khắc phục đáng tin cậy nhất là bật các gói tin "KeepAlive". Đây là những tín hiệu "nhịp tim" nhỏ, được mã hóa được gửi qua đường truyền SSH. Chúng duy trì kết nối đủ bận rộn để firewall không đánh dấu nó là đang ở trạng thái nghỉ.
Cách 1: Khắc phục phía máy khách (Tốt nhất cho hầu hết người dùng)
Đây là phương pháp được ưu tiên. Nó khắc phục vấn đề cho mọi máy chủ bạn kết nối mà không cần quyền quản trị trên máy chủ từ xa.
- Mở tệp cấu hình SSH cục bộ (hoặc tạo mới nếu chưa tồn tại):
nano ~/.ssh/config
- Thêm các dòng sau vào đầu tệp:
Host * ServerAliveInterval 60 ServerAliveCountMax 3
- Lưu và thoát (Ctrl+O, Enter, Ctrl+X).
**Cơ chế hoạt động:** Máy tính của bạn bây giờ sẽ gửi một "gói tin rỗng" (null packet) sau mỗi 60 giây. Nếu máy chủ không phản hồi ba lần liên tiếp (tổng cộng sau 180 giây), máy khách sẽ đóng phiên làm việc một cách an toàn. Điều này ngăn terminal của bạn bị treo trong 15 phút khi chờ đợi một mạng đã chết phản hồi.
### Cách 2: Khắc phục phía máy chủ (Tốt nhất cho quản trị viên)
Nếu bạn quản lý một hệ thống máy chủ và muốn đảm bảo nhóm của mình không bị ngắt kết nối, hãy sửa đổi cài đặt daemon SSH trên máy chủ.
- Chỉnh sửa cấu hình SSH toàn cục:
```
sudo nano /etc/ssh/sshd_config
- Tìm hoặc thêm các chỉ thị sau:
ClientAliveInterval 60
ClientAliveCountMax 3
- Khởi động lại dịch vụ để áp dụng các quy tắc mới:
sudo systemctl restart ssh
### Cách 3: Sử dụng dòng lệnh nhanh
Nếu bạn đang sử dụng máy tính công cộng hoặc mượn terminal và không thể chỉnh sửa tệp cấu hình, hãy truyền các cài đặt trực tiếp vào lệnh kết nối của bạn:
ssh -o ServerAliveInterval=60 user@192.168.1.100
## Kiểm tra kết quả
Việc xác nhận rất đơn giản. Kết nối với máy chủ của bạn và để nó ở trạng thái nghỉ. Nếu bạn vẫn có thể chạy `ls` hoặc `htop` sau 15 phút không hoạt động, các gói tin "nhịp tim" đang hoạt động tốt. Bảng NAT của router trung gian đang được làm mới bởi các gói tin gửi đi mỗi 60 giây của bạn.
## Mẹo nâng cao cho kết nối không ổn định
**Tránh bẫy TCPKeepAlive:** Bạn có thể thấy `TCPKeepAlive yes` trong một số hướng dẫn. Mặc dù nghe có vẻ tương tự, nhưng cài đặt này hoạt động ở lớp TCP thay vì lớp SSH. Nhiều firewall thông minh bỏ qua các gói tin này hoặc giả mạo chúng, khiến `ServerAliveInterval` trở thành một lựa chọn mạnh mẽ hơn nhiều.
**Sử dụng Mosh khi làm việc di động:** Nếu bạn thường xuyên làm việc trên tàu xe, quán cà phê hoặc qua điểm phát sóng di động, hãy thử **Mosh (Mobile Shell)**. Khác với SSH, Mosh sử dụng UDP và hỗ trợ chuyển vùng (roaming). Bạn có thể đóng laptop, thay đổi mạng Wi-Fi và mở lại để thấy phiên làm việc của mình vẫn nằm đúng vị trí cũ.
**Luôn sử dụng Tmux:** Đối với các tập lệnh chạy lâu, hãy luôn bắt đầu một phiên `tmux` hoặc `screen`. Ngay cả khi "đường ống bị vỡ" (broken pipe), tiến trình vẫn tiếp tục chạy trên máy chủ. Bạn chỉ cần kết nối lại và chạy `tmux attach` để tiếp tục công việc đang dang dở.

