我正在使用 Windows 7、Ruby 1.9.2、SciTE、Outpost Pro 2009 和 NetBalancer。
在 SciTE 中编写 Ruby 程序时,我按下Ctrl+Break
“杀死”按钮。这种方式旨在简单、快速且可靠。但现在我编写了一种我以前从未编写过的程序,并发现了一个问题。
程序使用 10 个线程(Thread.new
)来爬取一个网站open-uri
。每个线程下载一个小文件。一些网址有Timeout::Error
。
当我按下 时Ctrl+Break
,进程ruby.exe
终止(我也可以在任务管理器中看到它),SciTE 已准备好进行下一个F5
。Outpost 也没有显示任何网络活动。
但是!托盘中的 NetBalancer 图标显示,我的网络最大负载为 512kbps。当我打开 NetBalancer 时,我看到绿线,显示净负载,但列表中没有占用流量的进程,所以我不知道应该终止什么来阻止它。
当我这样做时netstat -o
,我看到了以下内容:
TCP 192.168.1.2:53629 server2:http FIN_WAIT_1 916
TCP 192.168.1.2:53630 server2:http FIN_WAIT_2 916
TCP 192.168.1.2:53631 server2:http FIN_WAIT_2 916
TCP 192.168.1.2:53632 server2:http FIN_WAIT_2 916
TCP 192.168.1.2:53648 server2:http FIN_WAIT_2 916
TCP 192.168.1.2:53664 server2:http FIN_WAIT_2 916
TCP 192.168.1.2:53667 server2:http FIN_WAIT_2 916
TCP 192.168.1.2:53676 server2:http FIN_WAIT_2 916
好像我只需要使用taskkill
,但是:
C:\Windows\system32>taskkill /PID 916
Ошибка: Не удается найти процесс "916".
(翻译:找不到进程“916”)
隐形进程持续占用我所有的网络通道几分钟,然后停止。连接netstat
也消失了。但我甚至不明白它是如何、为什么以及何时停止的,因为完整的下载任务应该持续近一个小时。所以它会自动停止?
无论如何,我想有办法杀死这个隐形进程食网者。
答案1
当进程退出时,Windows 会通过发送 FIN 数据包请求服务器关闭 TCP 连接。但是,由于您的连接使用率达到 100%,因此 FIN 数据包需要一些时间才能到达服务器。在此期间,服务器不知道进程已死亡,并发送更数据已发送给您。此FIN-WAIT
状态表示您的计算机已发送 FIN 数据包并正在等待确认 FIN+ACK。
该进程已停止;您看到它的 PID 是因为 PID 与其他 TCP 连接参数一起存储,并且连接尚未关闭。