Что происходит в BASH, когда вы нажимаете Ctrl-C (подсказка, это не просто отправка SIGINT)

Сначала немного предыстории - Когда я выполняю apt-get install ] загружает из Интернета моей компании, он обеспечивает высокий всплеск скорости (400-500 КБ / с) в течение первых 10 секунд или около того, затем падает до десятой части (40-50 КБ / с), а затем через несколько минут до поистине убогий (4-5Кб / с). Это наводит меня на мысль, что системный администратор реализовал какую-то схему регулирования сети.

Теперь я знаю, что сеть не просто неустойчива, потому что если я запускаю apt-get install foo , ] Ctrl-C через 10 секунд и немедленно снова запустите apt-get install foo (сделав стрелку вверх и введите, чтобы использовать историю bash), а затем продолжайте повторять этот процесс для несколько минут до загрузки всех пакетов , я могу очень быстро загрузить даже большие пакеты. В частности, даже после прерывания загрузки с помощью Ctrl-C, apt-get, похоже, может возобновить загрузку при следующем вызове.

Конечно, глядя на экран, выполняя Ctrl-C Up Enter каждые 10 секунд, становится действительно скучно очень быстро, поэтому я написал сценарий оболочки -

#!/bin/sh
for i in `seq 1 100` ; do
    sudo apt-get install foo -y &
    sleep 10
    sudo kill -2 $!
done

Кажется, он работает. Он порождает apt-get, запускает его в течение 10 секунд, а затем убивает (отправив SIGINT) его и снова запускает. Однако на самом деле это не работает, потому что теперь apt-get не возобновляет загрузку при последующих вызовах!

Эксперимент, который я провел sudo apt-get install foo с одного терминала, а затем запустил kill -2 с другого терминала. И даже в этом случае, когда я перезапускаю apt-get, загрузка не возобновляется.

Итак, очевидно, что Ctrl-C не эквивалентно SIGINT. И что-то еще происходит, когда я нажимаю Ctrl-C вручную, что дает apt-get возможность сохранить состояние загрузки. Вопрос в том, что это?

Edit

Это предложения, которые я получил до сих пор, но никаких сигар. Тайна углубляется! -

  1. В sudo kill -2 $! сигнал может поступать на sudo вместо apt-get . Это не причина, потому что, как упоминалось выше, я также пытался послать SIGINT специально для PID apt-get, и даже это помешало apt-get сохранить свое состояние.

  2. Sudo улавливает сигнал и отправляет другой сигнал apt-get. Я попытался послать apt-get все сигналы, которые мог придумать! Загрузка ни для одного из них по-прежнему не возобновляется. Загрузка возобновляется только тогда, когда я нажимаю Ctrl-C, чтобы убить его.

  3. Apt-get по-другому обрабатывает SIGINT, если он исходит из сценария, а не из интерактивной оболочки. Опять же, приведенный выше «эксперимент» доказывает, что это не так.

9
задан Anupam Jain 8 July 2011 в 17:02
поделиться