Câu trả lời:
Có một số cách để tìm quá trình chạy nào đang sử dụng một cổng.
Sử dụng bộ nhiệt áp, nó sẽ cung cấp cho (các) bộ lọc của nhiều trường hợp liên quan đến cổng nghe.
sudo apt-get install psmisc
sudo fuser 80/tcp
80/tcp: 1858 1867 1868 1869 1871
Sau khi tìm hiểu, bạn có thể dừng hoặc hủy quá trình.
Bạn cũng có thể tìm thấy các PID và biết thêm chi tiết bằng lsof
sudo lsof -i tcp:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1858 root 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1867 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1868 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1869 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1871 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
Để giới hạn các ổ cắm nghe trên cổng 80 (trái ngược với các máy khách kết nối với cổng 80):
sudo lsof -i tcp:80 -s tcp:listen
Để tự động tiêu diệt chúng:
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
Đây là một oneliner hiển thị lệnh để chạy:
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
Thay thế echo
bằng sudo
cho quá trình này để thực sự bị giết.
echo
chosudo
80
.
Ba tùy chọn để liệt kê các cổng mở được cung cấp trong jsh 's whatisonport
:
netstat -anp --numeric-ports | grep ":${PORT}\>.*:"
fuser -v "${PORT}"/tcp
lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"
Tôi thích netstat
vì nó nhanh, súc tích và có thể liệt kê các cổng được mở bởi người dùng khác. (Mặc dù nó vẫn sẽ cần siêu người dùng / đặc quyền người dùng để liệt kê tên và PID của các quy trình đó.)
$ netstat -anp --numeric-ports | grep ":80\>.*:"
tcp6 0 0 :::80 :::* LISTEN 1914/apache2
$ fuser -v "80/tcp"
USER PID ACCESS COMMAND
80/tcp: root 1914 F.... apache2
www-data 12418 F.... apache2
...
$ lsof -P -S 2 -i "tcp:80" | grep "\(:80->.*:\|:80 (LISTEN)$\)"
apache2 1914 root 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
apache2 12418 www-data 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
...
Việc sử dụng grep
trong hai trường hợp là chỉ khớp với cổng ở phía cục bộ và bỏ qua các kết nối mở với cổng từ xa 80. (Một cách khác là sử dụng -l
với netstat
hoặc lsof
sử dụng -sTCP:LISTEN
, nhưng tôi thích các greps ở trên vì chúng sẽ cũng bắt các kết nối đi từ cổng đã cho, đôi khi có thể được quan tâm.)
Với lsof
chúng tôi sử dụng -P
để hiển thị :80
thay vì :http
để làm cho grep có thể. Các -S 2
lực lượng tùy chọn lsof
để hoàn thành một cách kịp thời.
Giả sử chúng ta muốn sử dụng netstat
, chúng ta có thể lấy các PID như thế này:
$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...
Và chúng tôi thậm chí có thể chuyển các PID đó sang kill
:
... | xargs -d '\n' kill -KILL
Tuy nhiên, thường có khả năng dương tính giả khi sử dụng regexps, vì vậy tôi khuyên bạn chỉ nên nhìn vào đầu ra ban đầu netstat
và sau đó quyết định bằng tay có nên chạy hay không:
$ kill -KILL 1914
Tôi có một kịch bản khác được gọi là listopenports
có thể được quan tâm.
Bạn đã tìm ra quy trình cần giết: đó là số tiến trình 20570
và số nhị phân của nó có tên httpd
như được viết ở cuối dòng đầu ra netstat
. Bạn có thể giết nó bằng số kill 20570
hoặc theo tên killall httpd
nhưng tôi không khuyên bạn nên làm theo cách đó.
Các cổng thấp hơn 1024 có cách sử dụng được tiêu chuẩn hóa (thông thường), bạn có thể tra cứu các cổng đó và nhiều cổng khác less /etc/services
. Mục nhập cho cổng 80 thậm chí còn được nhận xét:
http 80/tcp www # WorldWideWeb HTTP
Vì vậy, nó rất có thể là một máy chủ web. Tên bạn có httpd
và man httpd
sẽ cung cấp cho bạn một gợi ý lớn rằng đó là nhị phân Apache phù hợp. Apache là một trong những người chơi lớn, nó có sẵn một số chương trình quản lý thoải mái nhưng bạn không cần chúng cho một hành động bắt đầu / dừng đơn thuần.
Bạn có bạc hà? Với một máy tính để bàn bình thường? Sau đó nhìn vào bên Control Center
dưới System
và nhấp vào Services
. Bạn cần phải là quản trị viên để làm bất cứ điều gì ở đó. Cuộn xuống cho đến khi bạn tìm thấy một cái gì đó có nhãn "máy chủ web" (Tôi có lighttpd thay vì Apache và không biết chính xác mục nhập của Apache sẽ như thế nào) và bỏ chọn nó.
Nếu bạn chỉ muốn dừng nó tạm thời thử, trong bảng điều khiển
sudo service stop httpd
và bắt đầu với sudo service start httpd
. service --status-all
trả về một danh sách tất cả các dịch vụ service
biết và có thể xử lý. Một phím tắt cho một khởi động lại một dịch vụ (có nghĩa là: dừng lại và bắt đầu nó theo thứ tự đó) là service --full-restart SERVICE
có SERVICE
là tên của dịch vụ, Eg .: httpd
trong trường hợp của Apache.
Hầu hết các chương trình bạn tìm thấy có netstat
thể được xử lý theo cách đó. Một số không thể và một số thậm chí không có trang nam nhưng những trang này rất hiếm.
Có một cách đơn giản để làm điều này. Trước tiên hãy kiểm tra quá trình nào đang sử dụng cổng 80 bằng netstat :
netstat -ntl | grep 80
Bây giờ bạn đã có tên quy trình và giết tiến trình bằng lệnh killall :
killall -9 process name
killall
mà không cần giải thích hoặc cảnh báo.
-k
tắc để giết tất cả các quy trình khớp và-i
để giết tương tác (nhắc nhở bạn cho từng quy trình).