【发布时间】:2011-10-01 06:19:40
【问题描述】:
先了解一点背景 - 当我从公司 Internet 下载 apt-get install 时,它会在前 10 秒左右提供高速爆发 (400-500KB/s),然后下降到该速度的十分之一 (40 -50KB/s),然后几分钟后就真的很惨了(4-5KB/s)。这让我觉得系统管理员已经实施了某种网络节流方案。
现在我知道网络不仅仅是不稳定的,因为如果我在 10 秒后启动 apt-get install foo、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。这不是原因,因为如上所述,我还尝试将 SIGINT 专门发送到 apt-get 的 PID,甚至阻止了 apt-get 保存其状态。Sudo 捕获信号并将其他一些信号发送到 apt-get。我尝试发送 apt-get 所有我能想到的信号!它仍然不会恢复其中任何一个的下载。只有当我按 Ctrl-C 杀死它时,它才会恢复下载。
如果 SIGINT 来自脚本而不是交互式 shell,则 Apt-get 处理 SIGINT 的方式不同。再一次,上面的“实验”证明这不是真的。
【问题讨论】:
-
有人可能会推测
apt-get安装了一个SIGINT处理程序,该处理程序只是根据它是否是运行在其上的交互式外壳来不同地处理其信号...... -
嗯,不能只是这样,因为在一个 shell 中运行 apt-get 并从另一个 shell 中杀死它仍然应该允许它捕获 SIGINT 并执行保存下载状态所需的任何操作。
标签: bash process kill apt sigint