Bạn đã bao giờ rơi vào tình huống muốn xóa một tệp tin hoặc gỡ cài đặt một dịch vụ trên VPS nhưng hệ thống cứ báo lỗi "File in use" đầy khó chịu chưa nhỉ? Lúc này, nếu không biết lsof là gì để kiểm tra xem tiến trình nào đang "chiếm hữu" tài nguyên, bạn sẽ vô cùng lúng túng đúng không? Thực tế, lsof là một công cụ cực kỳ mạnh mẽ giúp liệt kê tất cả các tệp tin đang được mở bởi các tiến trình trong hệ thống. Với kinh nghiệm của một Senior System Admin, tôi thường xuyên dùng lsof Linux để truy vết nhanh chóng các kết nối mạng đang treo hoặc tìm ra thủ phạm gây nghẽn đĩa cứng. Trong bài viết này, mình sẽ cùng bạn tìm hiểu kỹ về cách dùng lsof cũng như cách kiểm tra file đang mở để giúp việc quản trị hệ thống trở nên mượt mà hơn nhé!
Cần chuẩn bị gì trước khi dùng lệnh lsof?
- Quyền người dùng: Cần sử dụng quyền root hoặc sudo để có thể xem đầy đủ thông tin về các tệp tin và tiến trình thuộc sở hữu của các người dùng khác trong hệ thống.
- Hệ điều hành hỗ trợ: Hoạt động trên hầu hết các bản phân phối Linux (Ubuntu, Debian, CentOS, RHEL, Fedora) và macOS.
- Gói phần mềm bổ trợ: Nếu hệ thống chưa cài đặt sẵn, bạn cần cài đặt gói lsof thông qua trình quản lý gói tương ứng:
Cú pháp lệnh lsof là gì?
Lệnh lsof hỗ trợ nhiều dạng cú pháp khác nhau trên các hệ điều hành Linux/Unix.
lsof [OPTIONS] lsof [OPTIONS] [FILE] lsof [OPTIONS] -i [PROTOCOL] lsof [OPTIONS] -u [USER]
Các tùy chọn của lệnh lsof là gì?
Lệnh lsof cung cấp nhiều tùy chọn được phân thành các nhóm chức năng: lọc theo tiến trình, người dùng, file, mạng và điều chỉnh định dạng đầu ra.
| Tùy chọn ngắn | Tùy chọn dài | Mô tả |
|---|---|---|
| -a | lsof -a kết hợp các điều kiện lọc theo phép AND thay vì OR mặc định. | |
| -b | lsof -b tránh các lệnh gọi kernel có thể bị chặn khi truy vấn thông tin file. | |
| -c [tên] | lsof -c nginx liệt kê các file đang mở bởi tiến trình có tên bắt đầu bằng chuỗi chỉ định. | |
| -C | lsof -C vô hiệu hóa việc báo cáo tên lệnh từ kernel name cache. | |
| -d [mô tả] | lsof -d 1 chỉ hiển thị các file descriptor khớp với danh sách mô tả được chỉ định. | |
| -D [chế độ] | lsof -D b kiểm soát cách lsof xây dựng, đọc hoặc bỏ qua device cache file. | |
| -e [đường dẫn] | lsof -e /mnt bỏ qua các cảnh báo liên quan đến filesystem tại đường dẫn chỉ định. | |
| -E | lsof -E hiển thị thông tin endpoint của các file pipe và socket trên hệ thống hỗ trợ. | |
| -f | lsof -f cho phép xử lý đối số tiếp theo là tên file thông thường thay vì filesystem. | |
| -F [trường] | lsof -F p xuất đầu ra theo định dạng trường có thể phân tích bởi các chương trình khác. | |
| -g [PGID] | lsof -g 1234 lọc và hiển thị các file mở bởi tiến trình thuộc process group ID chỉ định. | |
| -h | lsof -h hiển thị thông tin trợ giúp tóm tắt về cú pháp và các tùy chọn. | |
| -i [địa chỉ] | lsof -i :80 liệt kê các file liên quan đến kết nối mạng Internet khớp với địa chỉ chỉ định. | |
| -I | lsof -I kiểm soát việc hiển thị thông tin địa chỉ IP trong danh sách kết nối mạng. | |
| -k [file] | lsof -k /proc/kallsyms chỉ định file kernel name list thay thế cho file mặc định của hệ thống. | |
| -K | lsof -K hiển thị các task (luồng) riêng lẻ trong tiến trình thay vì chỉ tiến trình cha. | |
| -l | lsof -l hiển thị UID dạng số thay vì tên người dùng trong cột USER. | |
| -L [số] | lsof -L 0 kiểm soát việc hiển thị link count của file, chỉ liệt kê file có link count nhỏ hơn giá trị chỉ định. | |
| -m [file] | lsof -m /proc/mounts chỉ định file mount supplement thay thế cho file mount mặc định của hệ thống. | |
| -M | lsof -M bật chế độ báo cáo thông tin portmapper cho các kết nối mạng liên quan. | |
| -n | lsof -n bỏ qua việc phân giải địa chỉ IP thành hostname, giúp tăng tốc độ thực thi. | |
| -N | lsof -N chỉ liệt kê các file đang được mở qua NFS (Network File System). | |
| -o | lsof -o hiển thị file offset thay vì kích thước file trong cột SIZE/OFF. | |
| -O | lsof -O bỏ qua cơ chế fork khi thu thập thông tin, giúp tránh treo tiến trình con. | |
| -p [PID] | lsof -p 1234 liệt kê tất cả các file đang mở bởi tiến trình có PID chỉ định. | |
| -P | lsof -P hiển thị số cổng dạng số thay vì tên dịch vụ trong thông tin kết nối mạng. | |
| -r [giây] | lsof -r 2 lặp lại việc liệt kê file theo chu kỳ thời gian chỉ định tính bằng giây. | |
| +r [giây] | lsof +r 2 tương tự -r nhưng tự động dừng khi không còn file nào thỏa điều kiện lọc. | |
| -R | lsof -R hiển thị cột PPID (Parent Process ID) của tiến trình cha trong kết quả đầu ra. | |
| -s [giao thức:trạng thái] | lsof -s TCP:LISTEN lọc kết nối mạng theo giao thức và trạng thái kết nối cụ thể. | |
| -S [giây] | lsof -S 3 thiết lập ngưỡng thời gian tính bằng giây cho các lệnh gọi kernel có thể bị chặn. | |
| -t | lsof -t chỉ xuất danh sách PID thuần túy, phù hợp để kết hợp với lệnh kill. | |
| -T [tùy chọn] | lsof -T f kiểm soát việc hiển thị thông tin TCP như trạng thái, queue size của kết nối. | |
| -u [user] | lsof -u root liệt kê tất cả các file đang mở bởi người dùng hoặc UID chỉ định. | |
| -U | lsof -U chỉ hiển thị các file socket thuộc loại Unix domain socket. | |
| -v | lsof -v hiển thị thông tin phiên bản, tác giả và các thông số biên dịch của lsof. | |
| -V | lsof -V hiển thị thông báo rõ ràng khi các mục tìm kiếm không được tìm thấy trong kết quả. | |
| -w | lsof -w vô hiệu hóa các thông báo cảnh báo xuất hiện trong quá trình thực thi lệnh. | |
| -W | lsof -W bật chế độ hiển thị thông tin về file locking trên các hệ thống hỗ trợ. | |
| -x [tùy chọn] | lsof -x mở rộng phạm vi tìm kiếm sang các symbolic link và mount point liên quan. | |
| -X | lsof -X bật chế độ báo cáo thông tin về các file đang được thực thi bởi tiến trình. | |
| -z [zone] | lsof -z global lọc kết quả theo tên Solaris zone, chỉ áp dụng trên hệ thống Solaris. | |
| -Z [context] | lsof -Z hiển thị SELinux security context của tiến trình trên hệ thống hỗ trợ SELinux. | |
| -- [file] | lsof -- /var/log/syslog liệt kê các tiến trình đang mở file chỉ định, phân biệt với các tùy chọn khác. |
xem thêm: System Monitoring and Management
Sử dụng lệnh lsof trong các tình huống thực tế như thế nào?
Phần này trình bày các kịch bản xử lý sự cố về tệp tin, kết nối mạng và quản lý tiến trình mà quản trị viên thường gặp.
lsof là gì? [Liệt kê tất cả tệp đang mở]
lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 8,1 4096 2 / systemd 1 root txt REG 8,1 1572864 25678 /usr/lib/systemd/systemd bash 1234 user txt REG 8,1 524288 34567 /bin/bash
Lệnh hiển thị danh sách toàn bộ các tệp tin, thư mục và socket đang được các tiến trình mở trên hệ thống. Trong thực tế, lệnh này thường gây nhiễu do số lượng kết quả quá lớn nếu không có tham số lọc.
lsof -i là gì? [Kiểm tra các kết nối mạng đang hoạt động]
lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1024 root 3u IPv4 12345 0t0 TCP *:22 (LISTEN) nginx 2048 www 4u IPv4 54321 0t0 TCP *:80 (LISTEN) curl 3050 user 3u IPv4 67890 0t0 TCP 192.168.1.5:5678->93.184.216.34:80 (ESTABLISHED)
Lệnh liệt kê các tiến trình đang thiết lập kết nối mạng hoặc đang lắng nghe trên các cổng (port). Trên môi trường production, đây là cách nhanh nhất để xác định ứng dụng nào đang chiếm dụng cổng dịch vụ.
lsof -p [PID] là gì? [Kiểm tra tài nguyên của một tiến trình]
lsof -p 2048 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 2048 root 4u IPv4 54321 0t0 TCP *:80 (LISTEN) nginx 2048 root 5u REG 8,1 1048576 999 /var/log/nginx/access.log
Lệnh hiển thị chi tiết tất cả tệp tin và socket mà một tiến trình cụ thể đang truy cập. Trong thực tế, sysadmin sử dụng lệnh này để kiểm tra xem một dịch vụ có đang ghi log vào đúng file cấu hình hay không.
lsof +D [directory] là gì? [Tìm tiến trình đang khóa thư mục]
lsof +D /var/log COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslog 567 root 3u REG 8,1 502345 123 /var/log/syslog systemd 1 root 4u DIR 8,1 4096 2 /var/log
Lệnh tìm kiếm tất cả các tệp tin đang được mở bên trong một thư mục và các thư mục con của nó. Đây là công cụ hữu ích khi bạn không thể unmount một ổ đĩa hoặc xóa một thư mục do lỗi "Device or resource busy".
lsof -i :[port] là gì? [Xác định ứng dụng chiếm dụng cổng]
lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 2048 root 4u IPv4 54321 0t0 TCP *:80 (LISTEN)
Lệnh lọc chính xác tiến trình đang lắng nghe trên một số cổng cụ thể. Trong các kịch bản deploy, lệnh này giúp giải quyết xung đột khi một dịch vụ mới không thể khởi chạy do cổng đã bị chiếm dụng bởi một tiến trình cũ.
lsof -iTCP -sTCP:ESTABLISHED là gì? [Lọc kết nối TCP đang hoạt động]
lsof -iTCP -sTCP:ESTABLISHED COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME curl 3050 user 3u IPv4 67890 0t0 TCP 192.168.1.5:5678->93.184.216.34:80 (ESTABLISHED)
Lệnh kết hợp nhiều điều kiện để chỉ hiển thị các kết nối TCP đang ở trạng thái thiết lập thành công. Trên môi trường production, kỹ thuật này giúp phân tích lưu lượng truy cập thực tế và giám sát các kết nối từ client đến server.
Tại sao lệnh lsof không hiển thị đúng thông tin hoặc báo lỗi quyền truy cập?
Trong quá trình quản trị hệ thống, người dùng thường gặp các rào cản về quyền hạn hoặc cấu hình khi sử dụng lsof để kiểm tra file và tiến trình.
Lỗi không hiển thị đầy đủ thông tin do thiếu quyền root
lsof /var/log/syslog lsof: WARNING: Permission denied
Khi chạy lệnh với tư cách người dùng thường, lsof không có quyền truy cập vào thông tin của các tiến trình thuộc sở hữu của root hoặc các file hệ thống nhạy cảm.
Lỗi không tìm thấy tiến trình đang chạy
lsof -i :80 lsof: invalid argument -- i
Lỗi xảy ra khi cú pháp của flag không chính xác hoặc phiên bản lsof trên hệ thống cũ không hỗ trợ định dạng tham số tìm kiếm cổng mạng như mong đợi.
Lỗi không hiển thị tiến trình khi file đã bị xóa nhưng vẫn đang được giữ bởi một ứng dụng
lsof /tmp/deleted_file.log lsof: No such file or directory
Trường hợp này xảy ra khi tệp tin đã bị xóa khỏi hệ thống tập tin nhưng tiến trình vẫn đang mở file đó, khiến việc truy vấn trực tiếp theo đường dẫn vật lý không còn hiệu lực.
Lỗi không liệt kê được các kết nối mạng trên môi trường container
lsof -i TCP lsof: command not found
Trong các bản phân phối Linux tối giản hoặc các Docker image (như Alpine), gói công cụ lsof thường không được cài đặt sẵn, dẫn đến việc không thể thực thi lệnh.
Quy trình thực tế dùng lsof trong quản trị hệ thống Linux?
Trong kịch bản xử lý sự cố tài nguyên hệ thống hoặc giải quyết xung đột cổng mạng khi triển khai dịch vụ web, lsof đóng vai trò là công cụ chẩn đoán quan trọng.
Bước 1: Kiểm tra các tiến trình đang chiếm dụng cổng dịch vụ
sudo lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1234 root 6u IPv4 23456 0t0 TCP *:http (LISTEN)
Lệnh này cho phép bạn xác định chính xác tiến trình nào đang lắng nghe trên cổng 80 để chuẩn bị cấu hình lại dịch vụ.
Bước 2: Xác định file đang bị khóa bởi một tiến trình cụ thể
lsof -p 1234 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1234 root 6u IPv4 23456 0t0 TCP *:http (LISTEN) nginx 1234 root 3r REG 0,45 12288 3 /etc/nginx/nginx.conf
Sau khi tìm được PID, lệnh này giúp bạn liệt kê tất cả các file đang được tiến trình đó mở, phục vụ việc kiểm tra tính toàn vẹn của cấu hình.
Bước 3: Tìm kiếm các file đã bị xóa nhưng vẫn chiếm dung lượng đĩa
lsof +L1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME apache2 5678 www-data 7u REG 8,12 500MB (deleted)
Trong trường hợp dung lượng đĩa bị đầy bất thường, lệnh này giúp phát hiện các file đã bị xóa (deleted) nhưng vẫn còn tiến trình đang giữ handle, ngăn cản hệ thống giải phóng bộ nhớ.
Bước 4: Giải phóng tiến trình để dọn dẹp tài nguyên
sudo kill -9 1234 [No output]
Sau khi dùng lsof để truy vết, bạn thực hiện lệnh kill để buộc dừng tiến trình đang gây xung đột hoặc chiếm dụng tài nguyên trái phép.
Khi quản trị VPS, việc sử dụng lệnh lsof cần lưu ý các vấn đề về quyền truy cập và hiệu năng hệ thống. Lệnh lsof yêu cầu quyền root để hiển thị đầy đủ thông tin về các tiến trình của người dùng khác. Việc thực thi lsof mà không có sudo dẫn đến kết quả thiếu hụt dữ liệu, gây khó khăn khi debug lỗi chiếm dụng cổng trên VPS. Trong các trường hợp hệ thống có số lượng file mở lớn, lệnh lsof có thể tiêu tốn tài nguyên CPU và gây trễ phản hồi. Ví dụ, lệnh sudo lsof -i :80 giúp xác định chính xác tiến trình đang chiếm dụng cổng HTTP. Người quản trị cần tránh chạy lsof trên các thư mục chứa hàng triệu file nhỏ để ngăn ngừa tình trạng treo session SSH. Việc kết hợp lsof với các tham số lọc cụ thể giúp tối ưu hóa tốc độ truy vấn thông tin trên môi trường VPS.
Những câu hỏi thường gặp về lệnh lsof?
Dưới đây là tổng hợp các tình huống sử dụng phổ biến nhất khi làm việc với lệnh lsof trong hệ điều hành Linux.
Làm thế nào để xem tất cả các tệp đang được mở bởi người dùng hiện tại?
Sử dụng tham số -u kết hợp với tên người dùng để lọc danh sách các tệp đang được truy cập.
lsof -u username COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1234 user cwd DIR 8,1 4096 2 /home/user
Cách tìm xem tiến trình nào đang sử dụng một cổng (port) cụ thể?
Sử dụng tham số -i kết hợp với số hiệu cổng để xác định ứng dụng đang lắng nghe trên cổng đó.
lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 567 root 6u IPv4 23456 0t0 TCP *:http (LISTEN)
Làm sao để kiểm tra xem một thư mục cụ thể đang được truy cập bởi tiến trình nào?
lsof +D /var/log COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME syslogd 890 root 3u REG 8,1 12345 7 /var/log/syslog
Lệnh lsof hiển thị những thông tin gì trong cột FD?
Cột FD (File Descriptor) cho biết loại mô tả tệp, ví dụ: r (read), w (write), u (read and write), hoặc các ký hiệu như cwd (current working directory), txt (program text).
lsof -p 1234 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME python 1234 user 3r REG 8,1 5000 1 /home/user/script.py
Cách tìm tất cả các tệp đang được mở bởi một PID nhất định?
Sử dụng tham số -p để lọc danh sách tệp dựa trên ID của tiến trình.
lsof -p 1234 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1234 user cwd DIR 8,1 4096 2 /home/user
Làm thế nào để liệt kê các tệp thuộc định dạng mạng (network files)?
Sử dụng tham số -i để lọc tất cả các kết nối mạng đang hoạt động.
lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 901 root 3u IPv4 12345 0t0 TCP *:22 (LISTEN)
Lệnh lsof là một công cụ mạnh mẽ giúp bạn liệt kê tất cả các tệp đang được mở bởi các tiến trình đang chạy trên hệ thống Linux. Bạn có thể vô cùng dễ dàng kiểm soát tài nguyên bằng cách kết hợp tham số -p để kiểm tra tệp của một PID cụ thể, hoặc dùng -i để rà soát nhanh các kết nối mạng đang hoạt động, đúng không nhỉ? Việc nắm vững các tùy chọn này chắc chắn sẽ giúp quá trình quản trị hệ thống của bạn trở nên linh hoạt và chính xác hơn rất nhiều. Chúc bạn thành công!