首先介绍一下背景-在我使用apt-get install
从公司的互联网下载时,前10秒钟左右会提供高速(400-500KB/s),然后速度就会降到十分之一(40-50KB/s),几分钟后就会变得非常慢(4-5KB/s)。这让我想到系统管理员已经实施了某种网络限制方案。
现在我知道网络不仅仅是不稳定的,因为如果我开始一个apt-get install foo
,并在10秒钟后按Ctrl-C
,然后立即再次运行apt-get install foo
(通过使用bash历史记录中的向上箭头和输入键),并且重复这个过程几分钟直到所有的软件包都被下载完成,我甚至可以快速下载大型软件包。特别地,即使使用Ctrl-C中止下载,apt-get似乎也能够在下一次调用中恢复下载。
当然,盯着屏幕每10秒钟做Ctrl-C Up Enter变得非常无聊,所以我写了一个shell脚本-
#!/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
。这不是原因,因为如上所述,我也尝试了专门向apt-get的PID发送SIGINT,即使那样也会阻止apt-get保存其状态。Sudo捕获信号并向apt-get发送其他信号。我尝试了向apt-get发送所有我能想到的信号!它仍然不能恢复下载。只有在我Ctrl-C手动杀死时,它才会恢复下载。
如果来自脚本而不是交互式shell,则apt-get会以不同的方式处理SIGINT。再次,“实验”证明这不是真的。
apt-get
安装了一个SIGINT
处理程序,该处理程序只是根据它所运行的是否为交互式 shell,以不同的方式处理其信号... - Linus Kleen