Linux中的timeout命令

时间:2020-03-05 15:29:54  来源:igfitidea点击:

“ timeout”是一个命令行实用程序,它运行指定的命令,如果在给定的时间段后仍在运行,则终止该命令。
换句话说,“超时”允许我们运行具有时间限制的命令。
“ timeout”命令是GNU核心实用程序软件包的一部分,该软件包几乎安装在所有Linux发行版中。

当我们要运行没有内置超时选项的命令时,它非常方便。

在本文中,我们将解释如何使用Linux的“超时”命令。

如何使用“timeout”命令

“超时”命令的语法如下:

timeout [OPTIONS] DURATION COMMAND [ARG]…

“ DURATION”可以是正整数或者浮点数,后跟可选的单位后缀:

  • 's'-秒(默认)
  • 'm'-分钟
  • 'h'-小时
  • 'd'-天

如果不使用任何单位,则默认为秒。
如果持续时间设置为零,则禁用关联的超时。

必须在参数之前提供命令选项。

以下是一些基本示例,这些示例演示了如何使用'timeout'命令:

  • 五秒钟后终止命令:
timeout 5 ping 8.8.8.8
  • 五分钟后终止命令:
timeout 5m ping 8.8.8.8
  • 一分钟六秒钟后终止命令:
timeout 1.1m ping 8.8.8.8

如果要运行需要提升权限的命令,例如“ tcpdump”,请在“超时”之前添加“ sudo”:

sudo timeout 300 tcpdump -n -w data.pcap

发送特定信号

如果未给出信号,则在达到时间限制时,“超时”会将“ SIGTERM”信号发送到托管命令。
我们可以使用'-s'('--signal')选项指定要发送的信号。

例如,要在一分钟后将“ SIGKILL”发送到“ ping”命令,我们可以使用:

sudo timeout -s SIGKILL ping 8.8.8.8

信号可以通过其名称(例如'SIGKILL')或者其数字(例如'9')来指定。
以下命令与上一个命令相同:

sudo timeout -s 9 ping 8.8.8.8

要获取所有可用信号的列表,请使用“ kill -l”命令:

kill -l

消除卡住的进程

超过时间限制时发送的默认信号“ SIGTERM”可能会被某些进程捕获或者忽略。
在那种情况下,该过程在发送终止信号后继续运行。

要确保监视的命令被杀死,请在后面加上一个时间段使用'-k'('--kill-after')选项。
在达到给定的时间限制后使用此选项时,“超时”命令会将“ SIGKILL”信号发送到托管程序,该信号无法捕获或者忽略。

在以下示例中,“超时”将命令运行一分钟,如果未终止,它将在十秒钟后将其杀死:

sudo timeout -k 10 1m ping 8.8.8.8

超时-k“ ./test.sh”

在达到指定的时间限制后被杀死

保留退出状态

达到时间限制后,“ timeout”将返回“ 124”。
否则,它将返回托管命令的退出状态。

要返回命令的退出状态(即使已达到时间限制),请使用'--preserve-status'选项:

timeout --preserve-status 5 ping 8.8.8.8

在前台中运行

默认情况下,“超时”在后台运行托管命令。
如果要在前台运行命令,请使用'--foreground'选项:

timeout --foreground 5m ./script.sh

当我们要运行需要用户输入的交互式命令时,此选项很有用。