Сначала немного предыстории - Когда я выполняю 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
Это предложения, которые я получил до сих пор, но никаких сигар. Тайна углубляется! -
В sudo kill -2 $!
сигнал может поступать на sudo
вместо apt-get
. Это не причина, потому что, как упоминалось выше, я также пытался послать SIGINT специально для PID apt-get, и даже это помешало apt-get сохранить свое состояние.
Sudo улавливает сигнал и отправляет другой сигнал apt-get. Я попытался послать apt-get все сигналы, которые мог придумать! Загрузка ни для одного из них по-прежнему не возобновляется. Загрузка возобновляется только тогда, когда я нажимаю Ctrl-C, чтобы убить его.
Apt-get по-другому обрабатывает SIGINT, если он исходит из сценария, а не из интерактивной оболочки. Опять же, приведенный выше «эксперимент» доказывает, что это не так.