timeout是一个命令行程序,用于在指定的时间内运行命令,如果超出指定时间,则终止该命令。

换句话说,timeout允许您在有时间限制的内运行命令。timeout命令是GNU核心程序的一部分。

timeout命令几乎安装在所有Linux发行版中。如果您想运行没有内置超时选项的命令,则非常方便。

在本教程中,我们将说明如何使用timeout命令,包括命令的语法和选项。

timeout命令

timeout命令的语法是timeout [OPTIONS] DURATION COMMAND [ARG]…

DURATION可以是正整数或浮点数,后跟时间单位秒sm分钟,h小时,d天,这是个可选的参数。

在不指定时间单位时,默认为秒。如果超时时间设置为零,则禁用超时。

COMMAND命令你要运行的命令,[ARG] 是要运行命令的参数,多个参数使用空格分隔。

如果要运行的命令需要以root用户运行,例如tcpdump命令,请在timeout命令之前加sudo

例如命令sudo timeout 300 tcpdump -n -w data.pcap 将会运行tcpdump命令300秒,也就是5分钟后停止tcpdump命令抓取数据包

sudo timeout 300 tcpdump -n -w data.pcap

发送进程信号

如果未给出信号,则在达到时间限制时,timeoutSIGTERM信号发送到给运行的命令。您也可以使用-s/--signal选项指定要发送的信号参数。

例如命令sudo timeout -s SIGKILL ping 8.8.8.8,将在一分钟后将SIGKILL发送到ping命令。您也可以按名称指定信号,例如SIGKILL或编号9

以下两个命令是等价的,要获取所有可用信号的列表,请运行kill -l命令,这将会打印所有进程信号的列表。

sudo timeout -s SIGKILL ping 8.8.8.8
sudo timeout -s 9 ping 8.8.8.8
kill -l

终止进程

SIGTERM是timeout命令默认发送进程信号,某些进程可能会捕获或忽略该信号。在这些情况下,进程会在发送终止信号后继续运行。

要确保杀死忽略SIGTERM信号的命令,请使用-k/--kill-after选项,后跟超时的时间。在达到指定的时间后timeout将会强制终止进程。

例如命令sudo timeout -k 10 1m ping 8.8.8.8timeout命令设置超时是一分钟,如果在一分钟后ping命令没有终止,它将在十秒钟后将其强制终止。

sudo timeout -k 10 1m ping 8.8.8.8

保留退出状态

在达到timeout设置的超时,timeout命令的退出代码将返回124。 否则,它返回运行命令的退出状态

即使在达到时间限制时也要返回timeout命令的退出状态,请使用--preserve-status选项。

timeout --preserve-status 5 ping 8.8.8.8

前台运行

默认情况下,timeout在后台运行托管命令。如果要在前台运行托管的命令,请使用--foreground选项。

当您要运行需要用户交互命令时,此选项很有用。

timeout --foreground 5m ./script.sh

在五秒后终止命令

timeout 5 ping 8.8.8.8

在五分钟后终止命令

timeout 5m ping 8.8.8.8

在一分钟零六秒后终止命令

timeout 1.1m ping 8.8.8.8

结论

timeout是一个命令行程序,用于在指定的时间内运行命令,如果超出指定时间,则终止该命令。

timeout是一个简单的命令没有太多选项。通常,您将仅需要设置两个参数,超时和要运行的命令。

如果您有任何问题或反馈,请随时发表评论。