1

Я использую Windows 7, Ruby 1.9.2, SciTE, Outpost Pro 2009 и NetBalancer.

Написание Ruby-программ в SciTE Я нажимаю Ctrl+Break чтобы убить их. Этот способ разработан, чтобы быть простым, быстрым и надежным. Но теперь я написал программу, которую никогда не писал раньше, и обнаружил проблему.

Программа собирает сайт в 10 тем (Thread.new) с помощью open-uri . Каждый поток загружает один маленький файл. Некоторые URL имеют Timeout::Error .
Когда я нажимаю Ctrl+Break , процесс ruby.exe умирает (я вижу это также в диспетчере задач), и SciTE готов к следующему F5 . Outpost также не показывает никакой сетевой активности.
НО! Значок NetBalancer в трее показывает, что моя сеть максимально загружена - 512 кбит / с. Когда я открываю 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 ответ1

2

Когда процесс завершается, Windows просит сервер закрыть соединение TCP, отправив пакет FIN. Однако, поскольку ваше соединение используется на 100%, пакет FIN требует некоторого времени для достижения сервера. В течение этого времени сервер не знает о смерти процесса и отправляет вам еще больше данных. Состояние FIN-WAIT означает, что ваш компьютер отправил пакет FIN и ожидает подтверждения FIN+ACK.

Процесс уже мертв; вы видите его PID, потому что PID хранится вместе с другими параметрами соединения TCP, и соединение еще не было закрыто.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .