如何在Linux上使用timeout命令

Linux笔记本电脑显示bash提示Fatmawati Achmad Zaenuri / Shutterstock.com

好的,这是足够的电脑时间。您可以为进程设置时间限制,设置它们可以运行的最长时间 超时命令。这是一个使用此命令限制运行程序的教程。

超时为你做什么?

超时 命令允许您设置程序运行时间的限制。但是你为什么要那样做呢?

一种情况是,您确切地知道要运行进程的时间。一个常见的用例就是拥有 超时 控制日志记录或数据捕获程序,以便日志文件不会无情地吞噬您的硬盘空间。

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

某些程序 – 甚至是简单的实用程序 – 可以在可能妨碍网络性能的级别上生成网络流量。或者他们可以占用目标设备上的资源,从而降低其性能。 (,我在看着你。)当你离开电脑时,让这些类型的程序长时间运行是不好的做法。

超时 是GNU Core Utils的一部分,因此Linux和类似Unix的操作系统(如macOS)都内置了超时功能。没有什么可以安装的;你可以开箱即用。

超时入门

这是一个简单的例子。例如,使用其默认的命令行选项, 命令将一直运行,直到你通过按Ctrl + C来停止它。如果你不打断它,它就会继续下去。

ping 192.168.4.28

在终端窗口中ping 192.168.4.28

通过使用 超时,我们可以确定 不会继续运行,扼杀网络带宽并纠缠正在被ping的任何设备。

下一个命令使用 超时 时间限制 。我们允许15秒的运行时间

超时15 ping 192.168.4.28

超时15在终端窗口中ping 192.168.4.28

15秒后 超时 终止了 会话,我们返回到命令行提示符。

在终端窗口中终止ping会话

使用超时与其他时间单位

请注意,我们不必在15后添加“s”。 超时 假设该值以秒为单位。你可以添加一个“s”,但它确实没有区别。

要使用以分钟,小时或天为单位测量的时间值,请添加“m”,“h”或“d”。

要ping运行三分钟,请使用以下命令:

超时3m ping 192.168.4.28

超时3m在终端窗口中ping 192.168.4.28

将运行三分钟 超时 介入并停止 会话。

在终端寡妇中运行ping会话

限制数据捕获超时

一些数据捕获文件可以非常快速地增长。为防止此类文件变得笨拙或甚至在问题上存在问题,请限制允许捕获程序运行的时间。

在这个例子中,我们正在使用 tcpdump的,网络流量捕获工具。在本文研究的测试机器上, tcpdump的 已经安装在Ubuntu Linux和Fedora Linux中。必须使用以下命令在Manjaro Linux和Arch Linux上安装它:

sudo pacman -Syu tcpdump

sudo pacman -Syu tcpdump在终端窗口中

我们可以跑 tcpdump的 使用默认选项持续10秒,并使用以下命令将其输出重定向到名为capture.txt的文件:

timeout 10 sudo tcpdump> capture.txt

如何在Linux上使用timeout命令 1

tcpdump的 有自己的选项将捕获的网络流量保存到文件。这是一个快速的黑客,因为我们正在讨论 超时不是 tcpdump的。)

tcpdump的 开始捕获网络流量,我们等待10秒钟。并且10秒来来去去 tcpdump的 仍在运行,capture.txt的规模仍在增长。这将是一个仓促的Ctrl + C停止 tcpdump的

用。检查capture.txt的大小 LS 表明它在几秒钟内就增长到了209K。那个文件快速增长!

ls -lh capture.txt

ls -lh在终端窗口中捕获.txt

发生了什么?为什么没有 超时tcpdump的

这与信号有关。

发出正确的信号

什么时候 超时 想要停止发送SIGTERM信号的程序。礼貌地要求程序终止。某些程序可能会选择忽略SIGTERM信号。当发生这种情况时,我们需要告诉你 超时 要有点强大。

我们可以通过询问来做到这一点 超时 改为发送SIGKILL信号。

SIGKILL信号不能被“捕获,阻止或忽略” – 总是通过。 SIGKILL礼貌地要求程序停止。 SIGKILL用秒表和cosh隐藏在拐角处。

我们可以使用 -s (信号)选项告诉 超时 发送SIGKILL信号。

timeout -s SIGKILL 10 sudo tcpdump> capture.txt

如何在Linux上使用timeout命令 2

这一次,只要10秒钟, tcpdump的 停了

tcpdump在终端窗口中被杀死

礼貌地问

我们可以问 超时 尝试使用SIGTERM停止程序,并且只在SIGTERM不起作用时才发送SIGKILL。

为此,我们使用 -k (杀死之后)选项。该 -k 选项需要时间值作为参数。

在这个命令中,我们要问 超时 使…能够 dmesg的 运行30秒,然后用SIGTERM信号终止它。如果 dmesg的 40秒后仍在运行,这意味着外交SIGTERM被忽略了 超时 应该发送SIGKILL来完成这项工作。

dmesg的 是一个实用程序,可以监视内核环缓冲区消息并在终端窗口中显示它们。

超时-k 40 30 dmseg -w

在终端窗口中超时-k 40 30 dmseg -w

dmesg的 运行30秒并在收到SIGTERM信号时停止。

终端窗口中dmesg的输出

我们知道这不是SIGKILL停止的 dmesg的 因为SIGKILL总是在终端窗口留下一个单词ob告:“被杀。”在这种情况下没有发生。

检索程序的退出代码

性能良好的程序在终止时将值传递回shell。这称为退出代码。通常,这用于告诉shell或启动程序的任何进程 – 程序在运行时是否遇到问题。

超时 提供自己的退出代码,但我们可能不关心。我们可能对该过程的退出代码更感兴趣 超时 在控制。

这个命令让 跑了五秒钟。它正在ping一台名为Nostromo的计算机,该计算机位于用于研究本文的测试网络上。

超时5 ping Nostromo.local

超时5在终端窗口中ping Nostromo.local

该命令运行五秒钟 超时 终止它。然后我们可以使用以下命令检查退出代码:

回声$?

输出ping和echo $?在终端窗口

退出代码是124.这是值 超时 用于表示程序已使用SIGTERM终止。如果SIGKILL终止程序,则退出代码为137。

如果我们用Ctrl + C中断程序,则退出代码 超时 是零。

超时5 ping Nostromo.local
回声$?

超时5使用Ctrl + C在终端窗口中ping Nostromo.local

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

为了实现这一点,程序必须自行停止(换句话说,它不会被终止 超时),我们必须使用 --preserve状态 选项。

如果我们使用 -C (count)选项,值为5 只会发出五个请求。如果我们给 超时 持续一分钟, 肯定会自行终止。然后我们可以使用检查退出值 回声

timeout –preserve-status 1m ping -c 5 Nostromo.local
回声$?

timeout --preserve-status 1m ping -c 5终端窗口中的Nostromo.local

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

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

timeout –preserve-status 1m ping -c 5 NotHere.local
回声$?

timeout --preserve-status 1m ping -c 5终端窗口中的NotHere.local

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

设置基本规则

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

body #primary .entry-content ul#nextuplist list-style-type:none; margin-left:0px; padding-left:0px;
body #primary .entry-content ul#nextuplist li a text-decoration:none; color:#1d55a9;

请阅读下一步

  • >为什么流媒体服务需要为HD和4K充电?
  • >如何流UFC 238 Cejudo vs. Moraes Online
  • >如何在Windows 10上输入Kaomoji(╯°□°)╯(┻━┻
  • >如何在线观看2019年FIFA女足世界杯(无线)
  • >谷歌的Stadia即将崩溃对ISP数据上限
本文机器自动生成,不保证语句完整通顺和表达准确,亦不对内容真实有效性负责,请读者知悉。