Tìm PID của quy trình sử dụng cổng trên Windows


107

Sự cố dịch vụ của tôi khi khởi động với phiên bản cổ điển:

java.rmi.server.ExportException: Listen failed on port: 9999

Làm thế nào tôi có thể tìm thấy quy trình để giết nó?


Các giải pháp thay thế phức tạp hơn tại đây: stackoverflow.com/questions/48198/…
Thomas

Câu trả lời:


217

Chỉ cần mở một trình bao lệnh và nhập (nói rằng cổng của bạn là 123456):

netstat -a -n -o | find "123456"

Bạn sẽ thấy mọi thứ bạn cần.

Các tiêu đề là:

 Proto  Local Address          Foreign Address        State           PID
 TCP    0.0.0.0:37             0.0.0.0:0              LISTENING       1111

ở đây làm thế nào để tôi nhận được chỉ là pid, vì nó trả toàn bộ chi tiết
Gobi M

làm thế nào để có được hình thức duy nhất PID trên các kết quả
Chinya

10
hoặc,nestat -aon | findstr 123456
ROMANIA_engineer

Cách dễ dàng để đạt được điều này trên windows được hiển thị trong câu hỏi này - stackoverflow.com/questions/48198/…
Dracontis

4
đối với windows / cygwin, nó có thể sẽ là netstat -a -n -o | grep "123456"
WebComer Ngày

84

Tìm PID của quy trình sử dụng cổng trên Windows (ví dụ: cổng: "9999")

netstat -aon | find "9999"

-a Hiển thị tất cả các kết nối và cổng nghe.

-o Hiển thị ID quá trình sở hữu được liên kết với mỗi kết nối.

-n Hiển thị địa chỉ và số cổng ở dạng số.

Đầu ra:

TCP    0.0.0.0:9999       0.0.0.0:0       LISTENING       15776

Sau đó giết quá trình bằng PID

taskkill /F /PID 15776

/F - Chỉ định để chấm dứt mạnh mẽ (các) tiến trình.

Lưu ý: Bạn có thể cần một quyền bổ sung (chạy từ quản trị viên) để giết một số quy trình nhất định


Tại sao netstat không thoát trừ khi bạn gắn cờ n?
Bãi biển Jared

2
@JaredBeach - nó đang đợi phân giải tên DNS ngược, vì vậy cuối cùng nó sẽ hoàn thành sau khi hết thời gian chờ. Nếu điều này bị treo trên các IP nội bộ , thì điều đó cho thấy sự cố với máy chủ DNS cục bộ của bạn.
Steve Friedl

7

Nếu bạn muốn thực hiện việc này theo chương trình, bạn có thể sử dụng một số tùy chọn được cung cấp cho bạn như sau trong tập lệnh PowerShell:

$processPID =  $($(netstat -aon | findstr "9999")[0] -split '\s+')[-1]
taskkill /f /pid $processPID

Tuy nhiên; lưu ý rằng bạn càng chính xác thì kết quả PID của bạn càng chính xác. Nếu bạn biết máy chủ lưu trữ cổng nào, bạn có thể thu hẹp nó rất nhiều. netstat -aon | findstr "0.0.0.0:9999"sẽ chỉ trả lại một ứng dụng và rất có thể là ứng dụng chính xác. Chỉ tìm kiếm trên số cổng có thể khiến bạn trả về các quy trình chỉ xảy ra với 9999nó, như sau:

TCP    0.0.0.0:9999                        0.0.0.0:0       LISTENING       15776
UDP    [fe80::81ad:9999:d955:c4ca%2]:1900  *:*                             12331

Ứng viên có nhiều khả năng nhất thường kết thúc trước, nhưng nếu quá trình đã kết thúc trước khi bạn chạy tập lệnh của mình, bạn có thể kết thúc với PID 12331 thay thế và giết quá trình sai.


4

Sau khi mày mò kịch bản, tôi đã đi đến hành động này. Sao chép và lưu nó trong tệp .bat:

FOR /F "usebackq tokens=5" %%i IN (`netstat -aon ^| find "3306"`) DO taskkill /F /PID %%i

Thay đổi 'tìm "3306" trong số cổng cần miễn phí. Sau đó chạy tệp với tư cách quản trị viên. Nó sẽ giết tất cả các tiến trình đang chạy trên cổng này.


4

Chỉ huy:

netstat -aon | findstr 4723

Đầu ra:

TCP    0.0.0.0:4723           0.0.0.0:0                LISTENING       10396

Bây giờ, hãy cắt ID quy trình, "10396", bằng forlệnh trong Windows.

Chỉ huy:

for /f "tokens=5" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa

Đầu ra:

10396

Nếu bạn muốn cắt số thứ 4 của giá trị có nghĩa là "LISTENING" thì lệnh trong Windows.

Chỉ huy:

for /f "tokens=4" %a in ('netstat -aon ^| findstr 4723') do @echo %~nxa

Đầu ra:

NGHE


bất kỳ đề xuất nào để lọc PID duy nhất vì lệnh đôi khi trả về cùng một quá trình nhiều lần?
Krzysztof Krzeszewski

2

Điều này giúp tìm PID bằng cách sử dụng số cổng.

lsof -i tcp:port_number

1
Sau khi gõ lệnh tôi nhận được'lsof' is not recognized as an internal or external command.
Srinivas

Hoạt động trong Linux.
Mahaveer Jangir

3
Câu hỏi này là về Windows
acaruci

0

PowerShell (Tương thích với lõi) một lớp lót để giảm bớt các tình huống copypaste:

netstat -aon | Select-String 8080 | ForEach-Object { $_ -replace '\s+', ',' } | ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID') | ForEach-Object { $portProcess = Get-Process | Where-Object Id -eq $_.PID; $_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; Write-Output $_ } | Sort-Object ProcessName, State, Protocol, AddressLocal, AddressForeign | Select-Object  ProcessName, State, Protocol, AddressLocal, AddressForeign | Format-Table

Đầu ra:

ProcessName State     Protocol AddressLocal AddressForeign
----------- -----     -------- ------------ --------------
System      LISTENING TCP      [::]:8080    [::]:0
System      LISTENING TCP      0.0.0.0:8080 0.0.0.0:0

Cùng một mã, thân thiện với nhà phát triển:

$Port = 8080

# Get PID's listening to $Port, as PSObject
$PidsAtPortString = netstat -aon `
  | Select-String $Port
$PidsAtPort = $PidsAtPortString `
  | ForEach-Object { `
      $_ -replace '\s+', ',' `
  } `
  | ConvertFrom-Csv -Header @('Empty', 'Protocol', 'AddressLocal', 'AddressForeign', 'State', 'PID')

# Enrich port's list with ProcessName data
$ProcessesAtPort = $PidsAtPort `
  | ForEach-Object { `
    $portProcess = Get-Process `
      | Where-Object Id -eq $_.PID; `
    $_ | Add-Member -NotePropertyName 'ProcessName' -NotePropertyValue $portProcess.ProcessName; `
    Write-Output $_;
  }

# Show output
$ProcessesAtPort `
  | Sort-Object    ProcessName, State, Protocol, AddressLocal, AddressForeign `
  | Select-Object  ProcessName, State, Protocol, AddressLocal, AddressForeign `
  | Format-Table
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.