通过使用超时,我们可以确保ping不会一直运行,不会占用网络带宽,也不会纠缠正在ping的任何设备。
下一个命令使用超时命令来限制ping的时间。我们允许15秒的运行时间来执行ping。
timeout 15 ping 192.168.4.28
15秒后,超时将终止ping会话,我们将返回到命令行提示符。
将超时与其他时间单位一起使用
请注意,我们不必在15后面添加“s”。超时假设该值以秒为单位。你可以加一个“s”,但这真的没什么不同。
要使用以分钟、小时或天为单位的时间值,请添加“m”、“h”或“d”。
要让ping运行三分钟,请使用以下命令:
timeout 3m ping 192.168.4.28
ping将运行三分钟,然后超时并介入并暂停ping会话。
使用超时限制数据捕获
某些数据捕获文件可能会很快变大。要防止此类文件变得笨重甚至在大小上有问题,请限制允许运行捕获程序的时间量。
在本例中,我们使用tcpdump,这是一个网络流量捕获工具。在本文研究的测试机器上,tcpdump已经安装在Ubuntu Linux和Fedora Linux上。它必须使用以下命令安装在Manjaro Linux和Arch Linux上:
sudo pacman -Syu tcpdump
我们可以使用其默认选项运行tcpdump 10秒,并使用以下命令将其输出重定向到名为capture.txt的文件:
timeout 10 sudo tcpdump > capture.txt
(tcpdump有自己的选项将捕获的网络流量保存到文件。这是一个快速攻击,因为我们讨论的是超时,而不是tcpdump。)
tcpdump开始捕获网络流量,我们等待10秒钟。10秒过去了,tcpdump仍在运行,capture.txt的大小仍在增长。需要匆忙按下Ctrl+C才能停止tcpdump。
使用ls检查capture.txt的大小,发现它在几秒钟内增长到209K。那个文件增长很快!
ls -lh capture.txt
发生了什么?为什么超时没有阻止tcpdump?
这都和信号有关。
发出正确的信号
当超时想要停止程序时,它发送SIGTERM信号。这会礼貌地请求程序终止。某些程序可能选择忽略SIGTERM信号。当这种情况发生时,我们需要告诉超时更有力一点。
我们可以通过要求超时来发送SIGKILL信号来实现这一点。
SIGKILL信号不能被“捕获、阻止或忽略”--它总是能通过。SIGKILL不会礼貌地要求程序停止。SIGKILL拿着秒表和COSH躲在角落里。
我们可以使用-s(信号)选项告知超时以发送SIGKILL信号。
timeout -s SIGKILL 10 sudo tcpdump > capture.txt
这一次,一旦经过10秒,tcpdump就会停止。
先礼貌地问
我们可以要求超时以尝试使用SIGTERM停止程序,如果SIGTERM不起作用,则仅发送SIGKILL。
为此,我们使用-k(删除之后)选项。k选项需要时间值作为参数。
在此命令中,我们要求超时以让dmesg运行30秒,然后使用SIGTERM信号终止它。如果dmesg在40秒后仍在运行,这意味着外交SIGTERM被忽略,超时应该发送SIGKILL来完成作业。
dmesg是一个实用程序,可以监视内核环缓冲区消息并在终端窗口中显示它们。
timeout -k 40 30 dmseg -w
dmesg运行30秒,并在收到SIGTERM信号时停止。
我们知道不是SIGKILL阻止了dmesg,因为SIGKILL总是在终端窗口留下一个字的讣告:“杀死”。在这种情况下没有发生这种情况。
正在检索程序的退出代码
行为良好的程序在终止时将一个值传回shell。这称为退出代码。通常,这用于告诉shell(或启动程序的任何进程)程序在运行时是否遇到问题。
超时提供了自己的退出代码,但我们可能并不关心这一点。我们可能对超时控制的进程的退出代码更感兴趣。
此命令可让ping运行五秒钟。它正在ping一台名为Nostromo的计算机,该计算机位于用于研究本文的测试网络上。
timeout 5 ping Nostromo.local
该命令运行5秒,超时将终止该命令。然后,我们可以使用以下命令检查退出代码:
echo $?
退票码是124。这是TIMEOUT用来指示程序已使用SIGTERM终止的值。如果SIGKILL终止程序,则退出代码为137。
如果我们使用Ctrl+C来中断程序,则超时的退出代码为零。
timeout 5 ping Nostromo.local
echo $?
如果程序的执行在超时终止之前结束,超时可以将退出代码从程序传递回shell。
要做到这一点,程序必须自动停止(换句话说,它不会因超时而终止),并且我们必须使用--preserve-status选项。
如果我们使用值为5的-c(Count)选项,ping将只发出5个请求。如果我们将超时时间定为一分钟,ping肯定会自行终止。然后,我们可以使用ECHO检查退出值。
timeout --preserve-status 1m ping -c 5 Nostromo.local
echo $?
Ping完成其五个ping请求并终止。退出代码是零。
要验证退出代码是否来自ping,让我们强制执行ping以生成不同的退出代码。如果我们尝试向不存在的IP地址发送ping请求,ping将失败,并显示错误退出代码。然后,我们可以使用ECHO检查退出代码是否是非零。
timeout --preserve-status 1m ping -c 5 NotHere.local
echo $?
ping命令显然无法到达不存在的设备,因此它报告错误并关闭。退出代码是2。这是ping用于一般错误的退出代码。
设置基本规则
超时就是为正在运行的程序提供一些界限。如果存在日志文件可能溢出您的硬盘的危险,或者您可能会忘记您的网络工具正在运行,请在超时时将它们包装起来,让您的计算机自我调节。