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 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: