gpt4 book ai didi

bash - 当您执行 Ctrl-C 时 BASH 中会发生什么(提示,它不仅仅是发送 SIGINT)

转载 作者:行者123 更新时间:2023-11-29 08:53:21 26 4
gpt4 key购买 nike

先介绍一下背景 - 当我做的时候 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 有机会保存下载状态。问题是 - 它是什么?

编辑

这些是我到目前为止收到的建议,但没有雪茄。谜团加深! -

  1. 关于 sudo kill -2 $!信号可能会转到 sudo而不是 apt-get .这不是原因,因为如上所述,我还尝试将 SIGINT 专门发送到 apt-get 的 PID,甚至阻止 apt-get 保存其状态。

  2. Sudo 捕获信号并将一些其他信号发送到 apt-get。我尝试发送 apt-get 我能想到的所有信号!它仍然不会恢复其中任何一个的下载。它只会在我按 Ctrl-C 将其终止时恢复下载。

  3. 如果 SIGINT 来自脚本而不是交互式 shell,Apt-get 会以不同方式处理它。同样,上面的“实验”证明这不是真的。

最佳答案

好吧,谜底解开了!感谢 Indian Linux Users Group 的热心人士.

这里的答案有两个——

首先,apt-get 调用另一个名为http 的程序来下载数据。

[~] ➔ file /usr/lib/apt/methods/http

/usr/lib/apt/methods/http: ELF 32-bit LSB executable, Intel 80386, version 1
(SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15,
stripped

请注意,这是一个可执行文件,甚至不是脚本,可能是为了在 perl/python/ruby 等还不可用时支持在系统安装期间下载文件。

其次,当您在运行 apt-get 后按 Ctrl-C 时,SIGINT 会发送到 http,而不是 apt-get。当 http 收到 SIGINT 时,它会在关闭前保存下载状态。

这是完美运行的更新脚本 -

#!/bin/sh
for i in `seq 1 100` ; do
sudo apt-get install foo -y &
sleep 10
sudo kill -2 `ps -ae | grep " http" | awk '{print $1}'`
done

关于bash - 当您执行 Ctrl-C 时 BASH 中会发生什么(提示,它不仅仅是发送 SIGINT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com