Sổ tay kỹ thuật

strace, lsof, /proc – debug tiến trình đang chạy

cheatsheet#linux#strace#lsof· cập nhật 2026-11-06

Tra nhanh lệnh strace, lsof, ltrace và /proc để biết process đang mở file nào, treo ở syscall nào, kết nối tới đâu.

Sửa trang này
Mục lục

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/5

lsof

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>