Tôi đã mở cổng # 5955 từ một lớp java để kết hợp từ máy khách. Làm thế nào để tôi đóng cổng này sau khi tôi hoàn thành? và lệnh nào có thể chỉ cho tôi nếu cổng mở hoặc đóng?
Tôi đã mở cổng # 5955 từ một lớp java để kết hợp từ máy khách. Làm thế nào để tôi đóng cổng này sau khi tôi hoàn thành? và lệnh nào có thể chỉ cho tôi nếu cổng mở hoặc đóng?
Câu trả lời:
Tìm ra ID tiến trình (PID) đang chiếm số cổng (ví dụ: 5955) mà bạn muốn giải phóng
sudo lsof -i :5955
Giết quá trình hiện đang sử dụng cổng bằng cách sử dụng PID của nó
sudo kill -9 PID
kill PID
(ngụ ý -15), sau đó thử -2 và -1. -9 là giải pháp cuối cùng chỉ khi mọi lựa chọn khác không hoạt động.
Để tìm quá trình thử:
sudo lsof -i :portNumber
Giết quá trình hiện đang sử dụng cổng bằng cách sử dụng PID của nó
kill PID
và sau đó kiểm tra xem cổng đã đóng chưa. Nếu không, hãy thử:
kill -9 PID
Tôi sẽ chỉ làm như sau nếu trước đó không hoạt động
sudo kill -9 PID
Chỉ để được an toàn. Một lần nữa tùy thuộc vào cách bạn mở cổng, điều này có thể không quan trọng.
Tuy nhiên, bạn đã mở cổng, bạn đóng nó theo cùng một cách. Ví dụ: nếu bạn đã tạo một ổ cắm, hãy gắn nó vào cổng 0.0.0.0:5955 và gọi là lắng nghe, đóng cùng một ổ cắm đó.
Bạn cũng có thể giết quá trình mở cổng.
Nếu bạn muốn tìm hiểu quy trình nào có cổng mở, hãy thử điều này:
lsof -i :5955
Nếu bạn muốn biết liệu một cổng có mở hay không, bạn có thể thực hiện cùng một lệnh lsof (nếu bất kỳ quá trình nào mở, nó sẽ mở; nếu không, thì không), hoặc bạn chỉ có thể thử kết nối với nó, ví dụ:
nc localhost 5955
Nếu nó trả về ngay lập tức mà không có đầu ra, cổng sẽ không mở.
Có thể đáng nói rằng, về mặt kỹ thuật, đó không phải là một cổng mở, mà là một kết hợp máy chủ: cổng. Ví dụ: nếu bạn cắm vào mạng LAN là 10.0.1.2, bạn có thể liên kết ổ cắm với 127.0.0.1:5955 hoặc 10.0.1.2:5955 mà không ảnh hưởng đến mạng kia hoặc bạn có thể liên kết với 0.0.0.0 : 5955 để xử lý cả hai cùng một lúc. Bạn có thể xem tất cả các địa chỉ IPv4 và IPv6 của máy tính bằng ifconfig
lệnh.
Năm 2018 đây là những gì làm việc cho tôi bằng MacOS HighSierra:
sudo lsof -nPi: yourPortNumber
sau đó:
sudo kill -9 yourPIDnumber
lsof -nPi
tốt hơn một chút vì số cổng thực sự hiển thị trong đầu ra và bạn sẽ có cảm giác tốt hơn về những gì bạn đang giết.
sudo lsof -nPi | grep LISTEN
Bạn cũng có thể sử dụng lệnh đầu tiên này để giết tiến trình sở hữu một cổng cụ thể:
sudo netstat -ap | grep :<port_number>
Ví dụ: giả sử quy trình này giữ cổng 8000 TCP, sau đó chạy lệnh:
sudo netstat -ap | grep :8000
sẽ xuất ra dòng tương ứng với quá trình giữ cổng 8000 , ví dụ:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
Trong trường hợp này, ProcHoldingPort là tên của quá trình mở cổng, 4683 là pid của nó và 8000 (lưu ý rằng đó là TCP) là số cổng mà nó giữ (mà bạn muốn đóng).
Sau đó, giết quá trình, theo ví dụ trên:
kill 4683
Như những người khác đã đề cập ở đây, nếu điều đó không hiệu quả (bạn có thể thử sử dụng kill với -9 làm đối số):
kill -9 4683
Một lần nữa, nói chung, tốt hơn hết là tránh gửi SIGKILL (-9) nếu bạn có thể.
Chúc mừng
Chàng.
Tôi sử dụng lsof
kết hợp với kill
, như đã đề cập ở trên; nhưng đã viết một tập lệnh bash nhỏ nhanh chóng để tự động hóa quá trình này.
Với tập lệnh này, bạn có thể chỉ cần gõ killport 3000
từ bất cứ đâu và nó sẽ giết tất cả các tiến trình đang chạy trên cổng 3000
.
lsof
kết hợp với kill
việc không trả lại bất cứ điều gì và khiến tập lệnh của tôi bị treo trên macOS Sierra. Nhưng killport
hoạt động như một sự quyến rũ và nhanh hơn. Cảm ơn!
Tôi đã tạo ra một chức năng cho mục đích này.
function free_port() {
if [ -z $1 ]
then
echo no Port given
else
PORT=$1;
PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port
if [ -z $PID ]
then
echo port: $PORT is already free.
else
sudo kill -9 $PID # kill the process, which frees the port
echo port: $PORT is now free.
fi
fi
}
free_port 80 # you need to change this port number
Sao chép và dán khối mã này trong thiết bị đầu cuối của bạn sẽ giải phóng cổng mong muốn của bạn. Chỉ cần nhớ thay đổi số cổng ở dòng cuối cùng.
thử bên dưới, giả sử cổng đang chạy là 8000
:
free-port() { kill "$(lsof -t -i :8000)"; }
Tôi tìm thấy tài liệu tham khảo ở đây
Trước tiên hãy tìm id của Procees (pid) đã chiếm cổng yêu cầu. (Ví dụ: 5434)
ps phụ | grep 5434
2. làm cho quá trình đó
kill -9 <pid>