如何在 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