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ó?
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âu trả lời:
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
nestat -aon | findstr 123456
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
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 9999
nó, 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.
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.
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 for
lệ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
Điều này giúp tìm PID bằng cách sử dụng số cổng.
lsof -i tcp:port_number
'lsof' is not recognized as an internal or external command.
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