Сначала небольшая предыстория. Когда я делаю 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 <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 сохранить свое состояние.Sudo ловит сигнал и отправляет какой-то другой сигнал в apt-get. Я пытался отправить apt-get все возможные сигналы! Он по-прежнему не возобновляет загрузку ни для одного из них. Он возобновляет загрузку только тогда, когда я нажимаю Ctrl-C, чтобы убить его.
Apt-get обрабатывает SIGINT по-разному, если он исходит из сценария, а не из интерактивной оболочки. Опять же, «эксперимент» выше доказывает, что это не так.
apt-get
устанавливает обработчикSIGINT
, который просто обрабатывает свой сигнал по-разному, в зависимости от того, интерактивная оболочка, в которой он работает, или нет... - person Linus Kleen   schedule 08.07.2011