如何在Linux上使用超时命令

好的,这就是足够的电脑时间了。您可以给进程设置时间限制,用timeout命令设置它们可以运行的最长时间。以下是使用此命令对运行程序进行限制的教程。

超时对你有什么作用?

设置超时命令允许您对程序将运行的时间长度设置限制。但你为什么要这么做呢?

一种情况是,您确切地知道希望进程运行多长时间。一种常见的用例是让超时来控制日志记录或数据捕获程序,这样日志文件就不会无情地吞噬您的硬盘空间。

另一种情况是,您不知道希望进程运行多长时间,但您知道不希望它无限期运行。您可能习惯于设置进程运行,最小化终端窗口,然后忘记它们。

某些程序-即使是简单的实用程序-可能会生成可能会影响网络性能的网络流量。或者,它们可以占用目标设备上的资源,从而降低其性能。(平,我正看着你呢。)。当您离开计算机时,让这些类型的程序长时间运行是不好的做法。

超时是GNU核心实用程序的一部分,因此Linux和类似Unix的操作系统(如MacOS)都内置了超时。没有什么需要安装的,您可以开箱即用。

超时入门

这里有一个简单的例子。例如,使用其默认的命令行选项,ping命令将一直运行,直到您按Ctrl+C将其停止。如果您不中断它,它将继续运行。

ping 192.168.4.28

通过使用超时,我们可以确保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.localecho $?

如果程序的执行在超时终止之前结束,超时可以将退出代码从程序传递回shell。

要做到这一点,程序必须自动停止(换句话说,它不会因超时而终止),并且我们必须使用--preserve-status选项。

如果我们使用值为5的-c(Count)选项,ping将只发出5个请求。如果我们将超时时间定为一分钟,ping肯定会自行终止。然后,我们可以使用ECHO检查退出值。

timeout --preserve-status 1m ping -c 5 Nostromo.localecho $?

Ping完成其五个ping请求并终止。退出代码是零。

要验证退出代码是否来自ping,让我们强制执行ping以生成不同的退出代码。如果我们尝试向不存在的IP地址发送ping请求,ping将失败,并显示错误退出代码。然后,我们可以使用ECHO检查退出代码是否是非零。

timeout --preserve-status 1m ping -c 5 NotHere.localecho $?

ping命令显然无法到达不存在的设备,因此它报告错误并关闭。退出代码是2。这是ping用于一般错误的退出代码。

设置基本规则

超时就是为正在运行的程序提供一些界限。如果存在日志文件可能溢出您的硬盘的危险,或者您可能会忘记您的网络工具正在运行,请在超时时将它们包装起来,让您的计算机自我调节。

相关文章