Dùng khi process treo, báo lỗi mơ hồ (permission denied, connection refused không rõ file/địa chỉ nào) hoặc nghi rò file descriptor. Cần quyền root (hoặc cùng user) để attach process khác. Xem thêm Load cao, máy chậm và tcpdump.
strace -p làm process chậm đi đáng kể vì dừng ở mỗi syscall. Trên dịch vụ production đang tải cao, hạn chế bằng -e trace= và -c, rồi detach (Ctrl+C) sớm. Trace có thể lộ dữ liệu nhạy cảm (password, token) trong tham số read/write, đừng dán nguyên file trace lên nơi công khai.
strace: chạy và attach
| Mục đích | Lệnh |
|---|---|
| Chạy lệnh dưới strace, ghi ra file | strace -o /tmp/trace.txt <lệnh> |
| Attach process đang chạy | strace -p <pid> |
| Theo cả tiến trình con/thread | strace -f -p <pid> |
| Mỗi tiến trình con một file | strace -ff -o /tmp/trace <lệnh> (tạo trace.<pid>) |
| Thống kê số syscall và thời gian | strace -c -f <lệnh> hoặc strace -c -p <pid> (Ctrl+C để in) |
| Sắp xếp thống kê theo số lần gọi | strace -c -S calls <lệnh> |
| Hiện thời gian mỗi syscall | strace -T <lệnh> |
| Timestamp tuyệt đối (µs) / tương đối | -tt / -r |
| Không cắt chuỗi dài (mặc định 32 ký tự) | -s 256 |
| Giải mã fd thành đường dẫn / socket | -y (path), -yy (kèm thông tin socket/protocol) |
| Stack trace tại mỗi syscall | -k (cần strace build có hỗ trợ) |
strace: lọc
| Mục đích | Lệnh |
|---|---|
| Chỉ syscall liên quan file | strace -e trace=%file <lệnh> |
Chỉ file mở bằng openat |
strace -e trace=openat <lệnh> |
| Chỉ syscall mạng | strace -e trace=%net <lệnh> |
| Chỉ tiến trình / signal | -e trace=%process / -e trace=%signal |
| Nhiều nhóm hoặc tên syscall | -e trace=connect,sendto,recvfrom |
| Chỉ syscall thất bại | -Z hoặc -e status=failed |
| Chỉ syscall thành công | -z |
| Chỉ thao tác trên một path | -P /etc/resolv.conf |
| Chỉ một số signal | -e signal=SIGTERM,SIGKILL |
Đọc kết quả: dòng như openat(AT_FDCWD, "/etc/app.conf", O_RDONLY) = -1 ENOENT (No such file or directory) cho biết chính xác file nào thiếu. Thứ tự hay gặp: ENOENT (không có file), EACCES (không đủ quyền), ECONNREFUSED (cổng không lắng nghe), EAGAIN (non-blocking, thường vô hại).
# Tìm app đọc config ở đâu, bỏ qua lỗi tìm thư viện
strace -f -e trace=%file -Z -o /tmp/t.txt <lệnh> ; grep -v '\.so' /tmp/t.txt | head
# Process treo: đang chờ gì?
strace -p <pid> # dòng cuối: futex(...) = chờ lock; read(5, ...) = chờ I/O trên fd 5
ls -l /proc/<pid>/fd/5lsof
Luôn thêm -nP (không resolve tên host/port) cho nhanh.
| Mục đích | Lệnh |
|---|---|
| File đang mở bởi process | lsof -nP -p <pid> |
| Theo tên lệnh / theo user | lsof -nP -c nginx / lsof -nP -u www-data |
| Ai đang lắng nghe TCP | lsof -nP -iTCP -sTCP:LISTEN |
| Ai dùng cổng 443 | lsof -nP -i :443 |
| Kết nối tới một host | lsof -nP -i @203.0.113.5 |
| Chỉ IPv4 / IPv6 | lsof -nP -i4 / lsof -nP -i6 |
| Ai đang mở file này | lsof /var/log/app.log |
| Ai đang giữ filesystem (khó umount) | lsof /mnt/data (đường dẫn là mount point) |
| Mọi file dưới thư mục | lsof +D /var/log (chậm trên cây lớn) |
| File đã xoá nhưng còn mở (chiếm đĩa) | lsof -nP +L1 |
| Unix socket | lsof -nP -U |
| Chỉ in PID (dùng trong script) | lsof -t -i :8080 |
| Kết hợp điều kiện bằng AND | lsof -nP -a -u root -i TCP |
| Lặp lại mỗi 2 giây | lsof -nP -r 2 -i :443 |
Ổ đĩa đầy mà du không thấy file nào: chạy lsof -nP +L1, cột SIZE/OFF lớn là file đã bị xoá nhưng process còn giữ. Restart process hoặc truncate qua : > /proc/<pid>/fd/<fd>. Xem thêm Disk đầy.
Cột FD của lsof: cwd (thư mục hiện hành), txt (binary), mem (thư viện mmap), số kèm r/w/u (đọc/ghi/cả hai).
/proc/<pid>
| Mục đích | Đường dẫn |
|---|---|
| Dòng lệnh đầy đủ (ngăn cách bằng NUL) | tr '\0' ' ' < /proc/<pid>/cmdline |
| Biến môi trường | tr '\0' '\n' < /proc/<pid>/environ (cần cùng user hoặc root) |
| Danh sách fd và đích | ls -l /proc/<pid>/fd |
| Số fd đang mở | ls /proc/<pid>/fd | wc -l |
| Giới hạn (open files, nproc...) | cat /proc/<pid>/limits |
| Trạng thái, RSS, số thread | grep -E 'State|VmRSS|Threads' /proc/<pid>/status |
| Syscall đang chờ | cat /proc/<pid>/syscall |
| Kernel stack (cần root) | cat /proc/<pid>/stack |
| Thư mục làm việc / binary | readlink /proc/<pid>/cwd / readlink /proc/<pid>/exe |
| Vùng nhớ map | cat /proc/<pid>/maps |
| Điểm OOM | cat /proc/<pid>/oom_score |
| Namespace | ls -l /proc/<pid>/ns |
State trong status: R chạy, S ngủ, D chờ I/O không ngắt được (thường là đĩa/NFS treo), Z zombie, T bị dừng.
ltrace
ltrace theo dõi lời gọi thư viện (libc...) thay vì syscall. Không phải máy nào cũng cài (apt install ltrace), và có thể không hoạt động với binary PIE/static hoặc Go.
| Mục đích | Lệnh |
|---|---|
| Trace lời gọi thư viện | ltrace <lệnh> |
| Kèm cả syscall | ltrace -S <lệnh> |
| Thống kê | ltrace -c <lệnh> |
| Attach process | ltrace -p <pid> |