Hi chào các bạn, dạo này mình hay gặp vấn đề Port Already in Use trên Windows do mình sử dụng hơi nhiều chương trình cùng một lúc, tức là mình không thể mở chương trình vì đang có chương trình khác chiếm port đó rồi. Cái này khá là khó chịu, đôi khi bạn không biết chương trình nào đang sử dụng port đấy để mà tắt đi. Nay mình sẽ hướng dẫn các bạn xử lý vấn đề này nhé
Mình thấy có 2 cách xử lý chính:
- Bạn đang cần mở chương trình A sử dụng port 8080, tuy nhiên chương trình B đã chiếm port 8080 từ bao giờ rồi. Vậy bạn có thể tắt chương trình B đi để mở được chương trình A
- Tình huống như bên trên, tuy nhiên bạn có thể config lại chương trình A sử dụng port khác đang trống để khởi động chương trình A lên
Cá nhân mình thấy (và mình đã gặp rất nhiều trường hợp) việc config lại port default mất khá nhiều thời gian, config lại chương trình đó xong nó kéo theo các vấn đề khác nữa nên khá là mệt. Cho nên mình thường xem xét chương trình B mình có cần sử dụng nữa không thì tắt quách nó đi. Tuy nhiên giữa 1 đống service, 1 đống chương trình đang chạy ngầm thì bạn không biết được chương trình nào đang sử dụng cái port kia để tắt đi đúng không, sau đây mình sẽ hướng dẫn các bạn kiểm tra xem port đó đang chạy với chương trình nào nhé
Đối với Linux
Ví dụ ở đây mình đang sử dụng port 8081 để mở http.server trên python
┌──(minhtuan㉿MinhTuan-ACER)-[~]
└─$ python3 -m http.server 8080 130 ⨯
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
Giờ mình quên mất là mình đang mở nó, có rất nhiều cách để kiểm tra
Cách 1: netstat
Sử dụng lệnh netstat -paten
để kiểm tra các port đang sử dụng
┌──(minhtuan㉿MinhTuan-ACER)-[/mnt/c/Users/minht]
└─$ sudo netstat -paten
[sudo] password for minhtuan:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1000 16551 77/python3
Kiểm tra đã thấy port 8080 đang được sử dụng bởi PID=77
, chương trình python3
Kill PID 77 đi là chúng ta có thể sử dụng port 8080 rồi (nhớ dùng quyền sudo đó nhé)
sudo kill -9 77
Cách 2: fuser
Có cách khác là sử dụng lệnh fuser
, tuy nhiên lệnh này không show cho chúng ta program name là gì nhưng các bạn có thể sử dụng
┌──(minhtuan㉿MinhTuan-ACER)-[/mnt/c/Users/minht]
└─$ sudo fuser 8081/tcp 1 ⨯
8081/tcp: 77
Kill tương tự lệnh kill bên trên, hoặc sử dụng lệnh sudo fuser -k 8080/tcp
là kill process được
Cách 3: lsof
List các process đang lắng nghe port 8080:
┌──(minhtuan㉿MinhTuan-ACER)-[/mnt/c/Users/minht]
└─$ sudo lsof -i:8080 1 ⨯
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3 77 minhtuan 3u IPv4 16551 0t0 TCP *:tproxy (LISTEN)
Kill toàn bộ process đang lắng nghe ở port 8080:
sudo kill $(lsof -t -i:8080)
Đối với Windows
Windows thì phức tạp hơn một chút, cũng sẽ có lệnh cho các bạn sử dụng, tuy nhiên người dùng Windows không hay gõ lệnh lắm mà sử dụng giao diện, mình sẽ giới thiệu cả 2 cách nhé
Sử dụng Task Manager
Mở Task Manager bằng cách chuột phải vào startbar và chọn Task Manager
Mở giao diện Resource Monitor bằng cách chọn tab Performance và chọn nó
Sang tab Network
Ở đây có thể check được những port nào đang mở, PID chương trình đang sử dụng port đó là bao nhiêu, tuy nhiên mình không thể kill PID ở màn hình này được, cần chuyển sang tab Details của Task Manager
Xác định được PID nào bạn muốn kill thì chuột phải chọn End task là xong
Sử dụng Command line
Tương tự như với Linux, Windows cũng có thể sử dụng command line để tìm kiếm và kill process
Vẫn sử dụng netstat
➜ ~ netstat -aon | findstr "8080" TCP 127.0.0.1:6767 127.0.0.1:8080 ESTABLISHED 16792 TCP 127.0.0.1:8080 0.0.0.0:0 LISTENING 2408 TCP 127.0.0.1:8080 127.0.0.1:6767 ESTABLISHED 2408
Cột cuối cùng chính là giá trị của PID, kill PID sử dụng câu lệnh bên dưới
➜ ~ taskkill /PID <process_id> /F
Khác
Đối với Windows thì có nhiều phần mềm có thể hiển thị và giúp chúng ta check rồi kill process dễ dàng hơn, các bạn có thể sử dụng những phần mềm đó, tuy nhiên vẫn cần phải đảm bảo an toàn nhé.
Kết
Qua đây là một vài cách mà các bạn có thể tìm kiếm, kiểm tra và kill những process không cần thiết đang chiếm port của mình. Cảm ơn các bạn đã đọc tới đây . Hẹn gặp lại.