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