คุณจะเพิ่มพอร์ตที่เปิดค้างไว้โดยกระบวนการที่ตายแล้วได้อย่างไร


63

เพื่อนร่วมงานของฉันเพิ่งพบปัญหาที่กระบวนการที่คาดคะเนว่าตายแล้วนั้นยังคงถูกผูกไว้กับพอร์ตเครือข่ายป้องกันไม่ให้กระบวนการอื่นผูกติดกับพอร์ตนั้น โดยเฉพาะnetstat -a -bได้รับรายงานว่ากระบวนการที่มีชื่อSystemกับ PID 4476 มีพอร์ต 60001 เปิดยกเว้นกระบวนการที่มี PID 4476 ไม่มีตัวตนอย่างน้อยเท่าที่ผมสามารถบอกได้

Process Explorer และตัวจัดการงานไม่ได้แสดงรายการ PID 4476 (แม้ว่าจะมีกระบวนการอื่นที่ชื่อว่าSystemPID 4 ซึ่งมีชุดการเชื่อมต่อ TCP ของตัวเองซึ่งไม่รวม 60001) taskkill /PID 4476ยังได้รายงานว่าไม่พบ PID 4476

มีวิธีฆ่ากระบวนการระบบลึกลับนี้เพื่อเพิ่มพอร์ตที่ถูกผูกไว้ในขณะนี้หรือไม่? อะไรจะทำให้สิ่งนี้เกิดขึ้นได้? จะมีกระบวนการที่ Task Manager, Process Explorer และ taskkill ไม่มีใครรู้ได้อย่างไร การรีบูตเครื่องมีการจัดการเพื่อแก้ไขปัญหา แต่ฉันต้องการที่จะทราบว่ามีวิธีการแก้ไขได้โดยไม่ต้องรีบูตเครื่อง


คุณรอนานแค่ไหนเพื่อดูว่าพอร์ตเปิดตัวหรือไม่ การเชื่อมต่อ (พอร์ต) ในสถานะใด ก่อตั้งขึ้น, ปิด, เวลา _ รอ?
joeqwerty

@joeqwerty: เรารออย่างน้อย 15-20 นาที น่าเสียดายที่ฉันลืมว่าสถานะการเชื่อมต่ออยู่ใน = /
Adam Rosenfield

20 นาทีดูเหมือนว่าจะมีปัญหา ครั้งต่อไปที่มันเกิดขึ้นให้เรียกใช้ netstat และตรวจสอบสถานะของการเชื่อมต่อซึ่งจะทำให้คุณรู้ว่าเกิดอะไรขึ้น ในขณะที่คุณแสดงความคิดเห็นต่อคำตอบของ mfinni อาจเป็นเพราะซอฟต์แวร์ \ service ของคุณหยุดทำงาน
joeqwerty

คำตอบ:


58

ฉันรู้ว่านี่เป็นเธรดเก่า แต่ในกรณีที่คนอื่นมีปัญหาเดียวกันฉันมี ...

สิ่งที่อาจเกิดขึ้นคือกระบวนการของคุณเปิดพอร์ต TCP เมื่อเกิดข้อผิดพลาดหรือออกโดยไม่ได้ปิดอย่างชัดเจน โดยปกติระบบปฏิบัติการจะล้างสิ่งต่าง ๆ เหล่านี้ แต่เมื่อบันทึกกระบวนการหายไป แม้ว่ากระบวนการอาจไม่ทำงานอีกต่อไป แต่อย่างน้อยก็มีสิ่งหนึ่งที่สามารถเก็บบันทึกของมันไว้เพื่อป้องกันการนำ PID กลับมาใช้ซ้ำ นี่คือการมีอยู่ของกระบวนการลูกที่ไม่ได้แยกออกจากผู้ปกครอง

หากโปรแกรมของคุณวางไข่กระบวนการใด ๆ ในขณะที่ทำงานให้ลองฆ่าพวกเขา ที่ควรทำให้เร็กคอร์ดกระบวนการของมันถูกทำให้เป็นอิสระและพอร์ต TCP จะถูกล้างข้อมูล เห็นได้ชัดว่า windows ทำเช่นนี้เมื่อมีการปล่อยบันทึกไม่ใช่เมื่อกระบวนการออกไปอย่างที่ฉันคาดไว้


1
ขอบคุณครับท่าน ฉันไม่อยากจะเชื่อเลยว่าคำตอบนี้ต่ำมากโดยเฉพาะอย่างยิ่งเนื่องจากคำค้นหาของ Google เต็มไปด้วยคำตอบ "ใช้ TCPView / ใช้ netstat & taskkill" ที่ไม่ได้ช่วยในกรณีนี้ ในกรณีของฉันสิ่งที่ช่วยให้เรียกใช้ ProcessExplorer และมองหากระบวนการใด ๆ ที่ถูกกำพร้า การปิดระบบลงช่วยแก้ปัญหาได้
gwiazdorrr

3
ขอบคุณสำหรับคำใบ้ของคุณ !! กระบวนการฆ่าเด็กกำพร้าแก้ปัญหาได้จริงๆ
Darkthread

ขอบคุณ !! นี่คือสิ่งที่เกิดขึ้นกับฉัน ฉันฆ่ากระบวนการกำพร้าและพอร์ตได้รับการปล่อยตัว ฉันไม่แน่ใจว่าจะค้นหากระบวนการที่ใช้กำพร้าโดยใช้ Process explorer ได้อย่างไร แต่ฉันรู้ชื่อของกระบวนการที่เกิดขึ้นดังนั้นจึงง่ายต่อการค้นหา
Grezzo

1
เรามีปัญหาเดียวกันนี้ - และการใช้ Process Explorer เห็นว่า Dr. Watson กำลังถือ PID เก่าอยู่ เราค้นหา (ค้นหา) สำหรับพอร์ตที่บริการพยายามเปิดแล้วเห็นรายการ 3-4 รายการสำหรับ Dr. Watson และ PID ที่ใช้ น่าประหลาดที่เราไม่ต้องฆ่าโดยปริยาย ดูเหมือนว่ากระบวนการนั้นจะ 'ปลุก' และมันก็หายไป ครั้งต่อไปที่เราพยายามเริ่มบริการใหม่
tresstylez

ปัญหาที่คล้ายกันอาจเกิดขึ้นระหว่างการดีบักด้วย VS ฉันแนบ VS เข้ากับกระบวนการและหลังจากผ่านไปหลายรอบ - สถานการณ์ที่อธิบายไว้เกิดขึ้น แต่ไม่มีกระบวนการของฉัน (รวมถึงลูก) ออก แต่การฆ่า "vsjitdebugger" ช่วยได้
Dmitry Azaraev

6

คุณลองใช้ TCPView และปิดการเชื่อมต่อหรือไม่ ฉันไม่รู้ว่ามันจะแสดงการเชื่อมต่อในสถานการณ์ที่คุณกำลังอธิบายเพราะฉันไม่เคยเกิดขึ้นกับฉัน แต่มันเป็นสิ่งเดียวที่ฉันสามารถคิดได้หากเกิดเหตุการณ์นี้ขึ้นอีกครั้ง

กระบวนการนี้เป็นอย่างไร - เป็นซอฟต์แวร์เชิงพาณิชย์หรืออะไรที่ปลูกเอง ดูเหมือนว่าจะใช้พอร์ตโทรจันหมายเลข 60001 - ฉันสงสัยว่ามันน่าจะเป็นรูทคิทหรืออะไรที่ซ่อนตัวเองจากระบบปฏิบัติการหรือไม่ อาจต้องการให้เครื่องดังกล่าวดีขึ้นอีกครั้งด้วย AV อาจเป็นบางสิ่งจากสื่อที่สามารถบู๊ตได้


ไม่เราไม่ลองใช้ TCPView ฉันจะระลึกไว้เสมอว่าในอนาคตหากเกิดขึ้นอีกครั้ง ซอฟต์แวร์เป็นซอฟต์แวร์ในบ้านของเราที่ใช้พอร์ต 60001 - ฉันเกือบจะแน่ใจว่ากระบวนการที่เปิดพอร์ตนั้นเป็นตัวอย่างก่อนหน้าของซอฟต์แวร์ของเราซึ่งบางตัวก็ไม่ได้ตายอย่างสมบูรณ์ ที่ป้องกันไม่ให้สำเนาของซอฟต์แวร์อื่นเปิดตัว
Adam Rosenfield

แอปพลิเคชันของคุณสามารถตั้งค่าตัวเลือก SO_REUSEADDR ของซ็อกเก็ตให้เป็นจริงก่อนที่จะผูกพัน ว่าควรจะแก้ปัญหาของคุณ (ก็จะยิ่งมากขึ้นหรือน้อยที่บังคับใช้กับศูนย์ *)
สเตฟาน

3

เปิด command prompt ในฐานะผู้ดูแลระบบ

  1. C: \ WINDOWS \ system32> netstat -ano | findstr: 7895

*** ทำซ้ำขั้นตอนที่ 2 จนกว่าจะไม่มีกระบวนการลูกอีก

  1. C: \ WINDOWS \ system32> กระบวนการ wmic โดยที่ (ParentProcessId = 1091) รับคำบรรยายภาพ ProcessId

    รหัสคำบรรยายภาพกระบวนการ

    cmd.exe 1328

2.a. C: \ WINDOWS \ system32> กระบวนการ wmic โดยที่ (ParentProcessId = 1328) รับคำบรรยายภาพ ProcessId

  Caption  ProcessId

  conhost.exe  1128

2.b. ทำซ้ำสิ่งนี้จนกว่าจะไม่พบกระบวนการลูกเพิ่มเติม

- จากนั้นฆ่ากระบวนการลูกทั้งหมด

  1. C: \ WINDOWS \ system32> taskkill / F / PID 1128 สำเร็จ: กระบวนการที่มี PID 9500 ถูกยกเลิก

คำสั่ง wmic เป็นวิธีเดียวที่เราจัดการเพื่อระบุกระบวนการลูกที่จริงเปิดพอร์ตของเรา ขอบคุณมาก.
K Erlandsson

นี่เป็นวิธีเดียวที่ฉันพบเพื่อแก้ไขปัญหาของฉัน กระบวนการหลักหายไปและกระบวนการลูกอยู่ในสถานะหยุดทำงานชั่วคราว แต่ยังคงถือพอร์ต TCP ด้วยสถานะ "การฟัง" ขอขอบคุณ.
Gui

1

ฉันได้ประสบปัญหาเดียวกันก่อนหน้านี้คำสั่ง netstat -a -n windows ให้ฉันรายการของพอร์ตที่เปิดด้วย ID กระบวนการ จากนั้นฉันได้รับหมายเลขพอร์ตที่ฉันต้องการปิดการเชื่อมต่อแล้วฉันปิดการเชื่อมต่อนั้นโดยใช้ซอฟต์แวร์ TCPView สิ่งนี้ใช้ได้สำหรับฉัน


-4

หากคุณเป็นผู้ใช้ windows ให้ทำตามขั้นตอนด้านล่างขั้นตอนที่ 1: ไปที่เส้นทางนี้: เครื่องมือแผงควบคุม \ รายการทั้งหมด \ เครื่องมือการควบคุม

ขั้นตอนที่ 2: คลิกที่บริการ

ขั้นตอนที่ 3: หยุดบริการที่ไม่ต้องการทำงานบนพอร์ตที่ต้องการ


-5

ps -ef | grep processname

ฆ่ากระบวนการที่เกี่ยวข้อง

kill -9 pid pid

ทำงานในกรณีของฉัน


6
คำถามนี้เกี่ยวกับ Windows ไม่ใช่ Linux
longneck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.