timeout是一个命令行程序,用于在指定的时间内运行命令,如果超出指定时间,则终止该命令。
换句话说,timeout
允许您在有时间限制的内运行命令。timeout
命令是GNU核心程序的一部分。
timeout
命令几乎安装在所有Linux发行版中。如果您想运行没有内置超时选项的命令,则非常方便。
在本教程中,我们将说明如何使用timeout
命令,包括命令的语法和选项。
timeout命令
timeout
命令的语法是timeout [OPTIONS] DURATION COMMAND [ARG]…
。
DURATION
可以是正整数或浮点数,后跟时间单位秒s
,m
分钟,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
发送进程信号
如果未给出信号,则在达到时间限制时,timeout
将SIGTERM
信号发送到给运行的命令。您也可以使用-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.8
,timeout
命令设置超时是一分钟,如果在一分钟后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
是一个简单的命令没有太多选项。通常,您将仅需要设置两个参数,超时和要运行的命令。
如果您有任何问题或反馈,请随时发表评论。