Linux 中的超时命令

评论 0 浏览 0 2020-01-24

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

当您想要运行没有内置超时选项的命令时,它会很方便。

在本文中,我们将解释如何使用 Linux timeout 命令。

如何使用timeout命令

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 timeout之前:

sudo timeout 300 tcpdump -n -w data.pcap

发送特定信号

如果未给出信号,则在达到时间限制时timeout 会向托管命令发送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) 选项,后跟一个时间段。当达到给定时间限制后使用此选项时,timeout 命令将SIGKILL 信号发送到无法捕获或忽略的托管程序。

在下面的示例中,timeout运行命令一分钟,如果不终止,它将在十秒后杀死它:

sudo timeout -k 10 1m ping 8.8.8.8

timeout -k “./test.sh”

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

保留退出状态

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

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

timeout --preserve-status 5 ping 8.8.8.8

在前台运行

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

timeout --foreground 5m ./script.sh

当您想要运行需要用户输入的交互式命令时,此选项非常有用。

结论

timeout命令用于运行有时间限制的给定命令。

timeout 是一个简单的命令,没有很多选项。通常,您将仅使用两个参数调用 timeout:持续时间和托管命令。

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

最后更新2023-09-24
0 个评论
标签