Làm thế nào để bạn giải phóng một cổng đang được mở bởi quá trình chết?


63

Một đồng nghiệp của tôi gần đây đã gặp phải một vấn đề trong đó một quy trình được cho là đã chết vẫn bị ràng buộc với một cổng mạng, ngăn các quy trình khác liên kết với cổng đó. Cụ thể, netstat -a -bđã báo cáo rằng một quy trình có tên là SystemPID 4476 đã mở cổng 60001, ngoại trừ không có quy trình nào với PID 4476 tồn tại, ít nhất là theo như tôi có thể nói.

Process Explorer và Trình quản lý tác vụ không liệt kê PID 4476 (mặc dù có một quy trình khác có tên là SystemPID 4, có bộ kết nối TCP riêng không bao gồm 60001). taskkill /PID 4476cũng báo cáo rằng không thể tìm thấy PID 4476.

Có cách nào để tiêu diệt quy trình Hệ thống bí ẩn này để giải phóng cổng mà nó hiện đang bị ràng buộc không? Điều gì có thể gây ra điều này xảy ra? Làm thế nào có thể có các quy trình mà không có Trình quản lý tác vụ, Trình khám phá quy trình và tác vụ nào không biết về? Khởi động lại được quản lý để khắc phục sự cố, nhưng tôi muốn biết liệu có cách nào khắc phục vấn đề này mà không cần khởi động lại không.


Bao lâu bạn chờ đợi để xem cổng được phát hành? Trạng thái nào là kết nối (cổng) trong? Thành lập, đóng cửa, Time_Wait?
joeqwerty

@joeqwerty: Chúng tôi đã đợi ít nhất 15-20 phút. Thật không may, tôi quên trạng thái kết nối trong = /.
Adam Rosenfield

20 phút nghe có vẻ như là một vấn đề. Lần tiếp theo nó xảy ra chạy netstat và kiểm tra trạng thái của kết nối, điều đó sẽ cho bạn manh mối về những gì đang xảy ra. Như bạn đã nhận xét câu trả lời của mfinni, đó có thể là kết quả của phần mềm \ dịch vụ của bạn bị sập.
joeqwerty

Câu trả lời:


58

Tôi biết đây là một chủ đề cũ, nhưng trong trường hợp bất kỳ ai khác có cùng một vấn đề, tôi đã ...

Điều có thể xảy ra là quá trình của bạn đã mở một cổng TCP khi nó bị sập hoặc thoát ra ngoài mà không đóng nó một cách rõ ràng. Thông thường HĐH sẽ dọn sạch những thứ này, nhưng chỉ khi bản ghi quy trình biến mất. Mặc dù quá trình có thể không còn chạy nữa, nhưng có ít nhất một điều có thể lưu giữ hồ sơ về nó, để ngăn chặn việc sử dụng lại PID của nó. Đây là sự tồn tại của một quá trình con không tách rời khỏi cha mẹ.

Nếu chương trình của bạn sinh ra bất kỳ quy trình nào trong khi nó đang chạy, hãy thử giết chúng. Điều đó sẽ khiến bản ghi quy trình của nó được giải phóng và cổng TCP sẽ bị xóa. Rõ ràng các cửa sổ thực hiện điều này khi bản ghi được phát hành không phải khi quá trình thoát như tôi mong đợi.


1
Cảm ơn, thưa ngài. Tôi không thể tin rằng câu trả lời này quá thấp, đặc biệt là khi truy vấn google chứa đầy câu trả lời "sử dụng TCPView / sử dụng netstat & taskkill" không giúp ích gì trong trường hợp này. Trong trường hợp của tôi, điều đã giúp là chạy ProcessExplorer và tìm kiếm bất kỳ quy trình nào đã mồ côi. Tắt chúng xuống giải quyết vấn đề.
gwiazdorrr

3
Cảm ơn gợi ý của bạn !! Giết chết quá trình mồ côi thực sự giải quyết vấn đề.
Darkthread

Cảm ơn!! Đây chính xác là những gì đã xảy ra với tôi. Tôi đã giết quá trình mồ côi và cảng được thả ra. Tôi không chắc chắn làm thế nào để tìm kiếm các quy trình mồ côi bằng cách sử dụng trình thám hiểm quy trình, nhưng tôi biết tên của các quy trình được sinh ra để dễ dàng tìm thấy.
Grezzo

1
Chúng tôi đã có vấn đề tương tự - và sử dụng Process Explorer đã thấy rằng Tiến sĩ Watson đang nắm giữ bộ vi xử lý cũ. Chúng tôi đã tìm kiếm (Tìm) cổng mà dịch vụ đang cố mở và sau đó thấy 3-4 mục cho Tiến sĩ Watson và PID mà nó đang sử dụng. Thật kỳ lạ, chúng tôi đã không phải ngầm giết bất cứ điều gì. Có vẻ như quá trình đó 'đánh thức nó' và nó biến mất. Lần sau chúng tôi cố gắng khởi động lại dịch vụ, nó đã hoạt động tốt.
tresstylez

Vấn đề tương tự có thể xảy ra trong quá trình gỡ lỗi với VS. Tôi gắn VS với quy trình và sau một số chu kỳ - tình huống được mô tả xảy ra, nhưng không có quy trình nào của tôi (bao gồm cả trẻ em) rời đi. Nhưng giết "vsjitdebugger" sẽ giúp.
Dmitry Azaraev

6

Bạn đã thử sử dụng TCPView và đóng kết nối chưa? Tôi không biết liệu nó có hiển thị kết nối trong kịch bản bạn mô tả hay không, bởi vì tôi chưa bao giờ có chuyện đó xảy ra với tôi. Nhưng đó là điều duy nhất tôi có thể nghĩ đến nếu điều này xảy ra lần nữa.

Quá trình là gì - đó là phần mềm thương mại, hay thứ gì đó trong nhà? Dường như cổng 60001 được sử dụng bởi một số Trojans - Tôi tự hỏi liệu nó có thể là một rootkit hoặc thứ gì đó có thể ẩn mình khỏi HĐH không? Có thể muốn cung cấp cho máy đó một lần nữa với AV, có thể là thứ gì đó từ phương tiện có thể khởi động.


Không, chúng tôi đã không thử TCPView; Tôi sẽ ghi nhớ điều đó cho tương lai nếu nó xảy ra lần nữa. Phần mềm này là phần mềm nội bộ của chúng tôi sử dụng cổng 60001 - Tôi gần như chắc chắn rằng quy trình giữ cổng mở là một phiên bản trước đó của phần mềm của chúng tôi mà bằng cách nào đó đã không hoàn toàn chết. Điều đó ngăn cản một bản sao khác của phần mềm khởi chạy.
Adam Rosenfield

Ứng dụng của bạn có thể đặt tùy chọn SO_REUSEADDR của ổ cắm thành true trước khi ràng buộc nó. Điều đó sẽ giải quyết vấn đề của bạn (thậm chí ít nhiều bắt buộc vào * nix)
Stephane

3

Mở dấu nhắc lệnh với tư cách quản trị viên

  1. C: \ WINDOWS \ system32> netstat -ano | tìm kiếm: 7895

*** Lặp lại bước 2 cho đến khi không còn quá trình con

  1. C: \ WINDOWS \ system32> quy trình wmic trong đó (ParentProcessId = 1091) nhận được chú thích, ProcessId

    Chú thích quá trình

    cmd.exe 1328

2.a. C: \ WINDOWS \ system32> quy trình wmic trong đó (ParentProcessId = 1328) nhận được chú thích, ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. lặp lại điều này cho đến khi không tìm thấy quá trình con

- Sau đó giết tất cả các quá trình con

  1. C: \ WINDOWS \ system32> taskkill / F / PID 1128 THÀNH CÔNG: Quá trình với PID 9500 đã bị chấm dứt.

Lệnh wmic là cách duy nhất chúng tôi quản lý để xác định quá trình con thực sự giữ cho các cổng của chúng tôi mở. Cảm ơn nhiều.
K Erlandsson

Đây cũng là cách duy nhất tôi tìm thấy để khắc phục vấn đề của mình. Quá trình chính đã biến mất và tiến trình con ở trạng thái treo, nhưng vẫn giữ cổng TCP với trạng thái "Lắng nghe". Cảm ơn bạn.
Gui

1

Tôi đã phải đối mặt với cùng một vấn đề trước đó, lệnh windows netstat -a -n đưa cho tôi danh sách các cổng mở với ID tiến trình. Từ đó tôi đã chọn số cổng mà tôi muốn đóng kết nối và sau đó tôi đóng kết nối đó bằng phần mềm TCPView. Điều này làm việc cho tôi.


-4

Nếu bạn là người dùng windows thì hãy làm theo các bước dưới đây Bước 1: Chuyển đến đường dẫn này: Bảng điều khiển \ Tất cả các mục Bảng điều khiển \ Công cụ quản trị

Bước 2: Nhấp vào dịch vụ

Bước 3: Dừng các dịch vụ không mong muốn chạy trên cổng mong muốn.


-5

ps -ef | tên quy trình grep

giết các quá trình liên quan

giết -9 pid

Làm việc trong trường hợp của tôi


6
câu hỏi này là về Windows, không phải Linux
longneck
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.