先介绍一点背景 - 当我apt-get install
从公司互联网下载时,它会在前 10 秒左右提供高速爆发(400-500KB/s),然后下降到该速度的十分之一(40-50KB/s),然后几分钟后到了一个真正的惨(4-5KB/s)。这让我觉得系统管理员已经实施了某种网络节流方案。
现在我知道网络不仅仅是不稳定的,因为如果我启动一个apt-get install foo
,Ctrl-C
它会在 10 秒后立即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
。这不是原因,因为如上所述,我还尝试将 SIGINT 专门发送到 apt-get 的 PID,甚至阻止 apt-get 保存其状态。Sudo 捕获信号并将其他一些信号发送到 apt-get。我尝试发送 apt-get 所有我能想到的信号!它仍然不会恢复其中任何一个的下载。只有当我按 Ctrl-C 杀死它时,它才会恢复下载。
如果 SIGINT 来自脚本而不是交互式 shell,则 Apt-get 处理 SIGINT 的方式不同。再一次,上面的“实验”证明这不是真的。