如何在 Linux 上使用超时命令如何在 Linux 上使用超时命令如何在 Linux 上使用超时命令如何在 Linux 上使用超时命令
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上使用超时命令

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

超时为您做什么?

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

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

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

某些程序(甚至是简单的实用程序)会产生一定程度的网络流量,从而影响您的网络性能。或者他们可以占用目标设备上的资源,从而降低其性能。 (ping,我在看着你。)当你离开计算机时让这些类型的程序长时间运行是不好的做法。

timeout 是 GNU Core Utils 的一部分,因此 Linux 和类 Unix 操作系统(例如 macOS)都内置了超时功能。无需安装任何东西;您可以开箱即用。

超时入门

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

ping 192.168.4.28

通过使用 timeout,我们可以确保 ping 不会一直运行,消耗网络带宽并干扰任何正在 ping 的设备。

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

timeout 15 ping 192.168.4.28

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

将超时与其他时间单位一起使用

请注意,我们不必在 15 后面添加“s”。timeout 假定该值以秒为单位。您可以添加一个“s”,但实际上并没有什么区别。

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

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

timeout 3m ping 192.168.4.28

ping 将运行三分钟,然后 timeout 介入并停止 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 有自己的选项可以将捕获的网络流量保存到文件中。这是一个快速的 hack,因为我们讨论的是 timeout,而不是 tcpdump .)

tcpdump 开始捕获网络流量,我们等待 10 秒。 10 秒来了又去,tcpdump 仍在运行,capture.txt 的大小仍在增长。需要快速按 Ctrl+C 来停止 tcpdump。

使用 ls 检查 capture.txt 的大小表明它在几秒钟内增长到 209K。该文件正在快速增长!

ls -lh capture.txt

发生了什么?为什么 timeout 没有停止 tcpdump?

这一切都与信号有关。

发送正确的信号

当 timeout 想要停止程序时,它会发送 SIGTERM 信号。这礼貌地要求程序终止。某些程序可能会选择忽略 SIGTERM 信号。当发生这种情况时,我们需要告诉 timeout 更强有力一些。

我们可以通过请求 timeout 发送 SIGKILL 信号来做到这一点。

SIGKILL 信号不能被“捕获、阻止或忽略”——它总是通过。 SIGKILL 不会礼貌地要求程序停止。 SIGKILL 带着秒表和 cosh 躲在拐角处。

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

timeout -s SIGKILL 10 sudo tcpdump > capture.txt

这一次,一旦 10 秒过去,tcpdump 就会停止。

先礼貌地询问

我们可以要求 timeout 尝试使用 SIGTERM 停止程序,并且仅在 SIGTERM 不起作用时才发送 SIGKILL。

为此,我们使用 -k(kill after)选项。 -k 选项需要一个时间值作为参数。

在此命令中,我们要求 timeout 让 dmesg 运行 30 秒,然后用 SIGTERM 信号终止它。如果 dmesg 在 40 秒后仍在运行,这意味着外交 SIGTERM 被忽略并且 timeout 应该发送 SIGKILL 来完成工作。

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

timeout -k 40 30 dmseg -w

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

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

检索程序的退出代码

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

timeout 提供了自己的退出代码,但我们可能不关心它。我们可能对 timeout 控制的进程的退出代码更感兴趣。

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

timeout 5 ping Nostromo.local

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

echo $?

退出代码是 124。这是 timeout 用来指示程序已使用 SIGTERM 终止的值。如果 SIGKILL 终止程序,则退出代码为 137。

如果我们使用 Ctrl+C 中断程序,timeout 的退出代码为零。

timeout 5 ping Nostromo.local
echo $?

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

为此,程序必须自行停止(换句话说,它不是被timeout终止),我们必须使用 --preserve-status 选项。

如果我们使用值为 5 的 -c(计数)选项,ping 将只会触发五个请求。如果我们给 timeout 一分钟的持续时间,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命令显然无法到达不存在的设备,因此报错并关闭。退出代码是两个。这是 ping 用于一般错误的退出代码。

制定基本规则

timeout 就是为运行的程序提供一些边界。如果日志文件有可能超出您的硬盘驱动器,或者您可能忘记您让网络工具处于运行状态,请将它们包装在 timeout 中并让您的计算机自我调节。

Linux Commands
Files tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc
Processes alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap
Networking netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld

RELATED: Best Linux Laptops for Developers and Enthusiasts

©2015-2025 艾丽卡 support@alaica.com