Linux: Tìm Kiếm Process Đang Chiếm Cổng Cho Trước

Viết bởi: Lê Trung , 4 tháng trước

Trên Linux có những cách nào để kiểm tra xem một cổng đang bị chiếm bởi process nào? Đây là một trong những tác vụ phổ biến với ngay cả các developer và các sysadmin.

Một trong những lỗi hệ thống hay báo khi Apache web server không thể khởi động đó là bởi cổng 80 đang bị chiếm giữ bởi một process khác. Tuy nhiên hệ thống cũng không nói rõ process cụ thể nào và bạn cần phải tự tìm ra.

Trong bài viết này chúng ta sẽ tìm hiểu các cách khác nhau để tìm ra process đang chiếm giữ một cổng nào đó trên Linux. Cụ thể chúng ta sẽ tìm hiểu cách sử dụng các chương trình sau để thực hiện tác vụ trên:

  • netstat
  • lsof
  • fuser

Lưu ý: Tất cả các câu lệnh trên đều yêu cầu được chạy dưới quyền root. Bạn có thể chạy các câu lệnh trong ví dụ này sử dụng sudo trước mỗi câu lệnh hoặc đăng nhập vào root sử dụng `$ sudo su.

Sử Dụng netstat

Để sử dụng câu lệnh Kiểm tra câu lệnh netstat tồn tại trên hệ thống:

$ netstat --version

Hoặc:

$ netstat -V

Nếu hệ thống báo lỗi câu lệnh netstat không tồn tại thì chúng ta cần cài đặt chương trình này.

Cài Đặt netstat Trên Debian

Đề cài đặt netstat trên các Linux distro Debian (như Ubuntu) chúng ta sẽ sử dụng chương trình quản lý package Aptitude. Trên cửa sổ dòng lệnh bạn chạy câu lệnh sau:

# apt-get install -y net-tools

Nếu như bạn gặp lỗi hệ thống báo về không tìm thấy net-tools thì bạn cần cập nhật package index của Aptitude:

# apt-get update

Và sau đó chạy lại câu lệnh cài đặt trước đó.

Cài Đặt netstat Trên Redhat

Đề cài đặt netstat trên các Linux distro của Redhat (như Centos hay Redhat Enterprise Linux) chúng ta sẽ sử dụng chương trình quản lý package Yum. Trên cửa sổ dòng lệnh bạn chạy câu lệnh sau:

# yum install -y net-tools

Nếu như bạn gặp lỗi hệ thống báo về không tìm thấy net-tools thì bạn cần cập nhật package index của Aptitude:

# yum update

Và sau đó chạy lại câu lệnh cài đặt trước đó.

Sử Dụng netstat

Sau khi chương trình netstat đã được cài trên máy chúng ta sẽ chạy câu lện sau đây trên cửa sổ dòng lệnh:

# netstat -tulpn

Câu lệnh trên sẽ hiển thị:

Kết quả trả về từ câu lệnh netstat

Để kiểm tra process chiếm một cổng cụ thể:

netstat -tulpn | grep $port_number

Trong đó $port_number là cổng bạn muốn kiểm tra. Ví dụ:

# netstat -tulpn | grep $port_number

Dùng câu lệnh netstat để kiểm tra process chiếm cổng cho trước

Từ kết quả trên chúng ta có thể thấy Nginx đang chiếm cổng 80 dưới giao thức TCP. Chúng ta có thể chạy câu lệnh dưới đây để kiểm tra lại:

$ ls -l /proc/8/exe

Câu lệnh trên sẽ hiển thị:

Kiểm tra thông tin của process với PID cho trước

Sử Dụng lsof

Câu lệnh lsof (list open files) dùng để liệt kê các file đang được mở trên hệ thống. Trên hệ điều hành Linux về bản chất mọi thứ đều là các file.ngay cả các network đang hoạt động về bản chất cũng là các file.

Kiểm tra sự tồn tại của câu lệnh lsof trên hệ thống:

$ lsof -v

Nếu câu lệnh lsof không tồn tại bạn cần cài đặt chương trình này.

Với các Linux distro Debian chúng ta sử dụng câu lệnh sau đề cài đặt lsof:

# apt update && apt install lsof

Với các Linux distro Redhat chúng ta sử dụng câu lệnh sau đề cài đặt lsof:

# yum update && yum install lsof

Sau khi cài đặt chúng ta sẽ sử dụng câu lệnh lsof với cú pháp như sau để hiển thị các process đang chiếm giữ một cổng nào đó:

lsof -i :$port_number

Trong đó $port_number là cổng bạn muốn kiểm tra. Bạn cũng lưu ý dấu : ở phía trước $port_number. Ví dụ dưới đây sẽ kiểm tra xem process nào đang sử dụng port 80:

# lsof -i :80

Câu lệnh trên sẽ hiển thị kết quả như sau:

Tìm process đang sử dụng cổng cho trước với câu lệnh lsof

Ngoài ra để tìm ra process đang chiếm cổng cho trước và chạy trên giao thức cho trước bạn có thể sử dụng cú pháp sau:

lsof -i $protocol_name:$port_number

Ví dụ câu lệnh sau sẽ tìm ra các process đang chạy cổng 80 và sử dụng giao thức TCP:

# lsof -i tcp:80

Sử Dụng fuser

Chúng ta sử dụng câu lệnh fuser để tìm ra ID của process (PID) đang chiếm cổng cho trước. Câu lệnh dưới đây sẽ tìm ra ID của process đang sử dụng giao thức TCP và chiếm cổng 80:

# fuser 80/tcp

Câu lệnh trên sẽ hiển thị kết quả như sau:

![Sử dụng fuser để tìm process sử dụng cổng cho trước]()

Kết quả trên nói rằng có hai process với ID là 8 và 10 đang hoạt động sử dụng giao thức TCP và chiếm cổng 80.

Để hiển thị thêm thông tin về process với ID cho trước, chúng ta sử dụng câu lệnh ps. Ví dụ như sau:

$ ps aux | grep 8

Câu lệnh trên sẽ hiển thị kết quả như sau:

Kết quả hiển thị của câu lệnh ps

Để biết ý nghĩa của các giá trị được hiển thị ở trên là gì bạn chạy câu lệnh ps aux và bỏ qua phần pipe grep như sau:

Mapping Giữa Port, Protocol và Service

Đôi khi bạn muốn tìm xem một port cho trước được map với giao thức và service nào. Để thực hiện tác vụ này chúng ta sẽ chạy câu lệnh sau:

$ grep $port_number /etc/services

Ví dụ:

$ grep 443 /etc/services

Câu lệnh trên sẽ hiển thị kết quả như sau:

Mapping giữa Port, Protocol và Serivice

Linux Ubuntu Linux Command Terminal Redhat
Thêm Bình Luận: