Linux: Tìm Kiếm Process Đang Chiếm Cổng Cho 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 ...
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ị:
Để 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
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ị:
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:
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:
Để 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: