linux用户命令,运行某个命令后,指定运行时间过后自动结束程序运行的timeout命令详解
timeout命令介绍:
这个命令在linux的各大发行版本中几乎都自带的,无需安装,终端输入命令即可运行。
启动命令后,如果在指定的时间过后仍在运行,则杀死该运行的程序。
timeout命令书写语法格式:
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [选项,不是必填] 命令可以运行的时间 任意命令 [参数,不是必填]...
DURATION(持续运行的时间)
可以是正整数或浮点数,后跟可选的单位后缀:
s
-秒(默认)m
-分钟h
-小时d
-天
不指定单位时,默认为秒。 如果持续时间设置为零,则后面运行的任意命令都不会被强制杀死,直到该命令自身运行结束为止(其实设置为0后,这该命令也就失去了使用它的意义);必须在参数前提供命令选项。
命令使用示例:
linux中的ping命令执行后,只要用户不在终端结束该命令或者不关闭当前命令运行的终端,就会一直运行,这时候我们可以使用timeout命令配合ping命令,实现在3秒后结束ping。
参数讲解:
注:在书写命令的时候,长选项必须使用的参数对于短选项时也是必需使用的。
--help参数
--help 显示timeout的帮助文档信息并退出。
--version参数
--version 输出当前timeout的版本信息并退出。
-s,--signal指定信号参数
-s, --signal=SIGNAL
如果未给出任何信号,则当达到时间限制时,timeout将SIGTERM信号发送到托管命令。
可以使用-s(-signal)选项指定要发送的信号。
指定的信号可以是“HUP”之类的名称或数字;有关信号列表,请参见“kill-l”
这里首先来说明下信号:
程序如果不对信号处理,就会导致程序退出,但如果程序捕获信号进行处理,按照它的逻辑,它是不一定会退出的。
使用timeout命令后如果不指定信号系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该signal后,将会发生以下的事情
- 程序立刻停止
- 当程序释放相应资源后再停止
- 程序可能仍然继续运行
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以配置的。如果程序正在等待IO,可能就不会立马做出相应。也就是说,SIGTERM多半是会被阻塞的、忽略。
熟知的kill -9 pid 、kill -SIGKILL命令执行后动作是立即结束指定进程,也就是强制杀死,不会等待这个命令跑完未完成作业后在进行杀死的。
例如我们运行一个命令后,我希望它3秒后立刻停止运行,也不会在后台让他继续在运行,就可以这样使用,示例如下:
timeout -s sigkill 3 ping qq.com
sigkill也可以替换为数字9
当然也可以指定其它各种信号,这里就不一一列举,可以使用kill -l查看系统内的所有信号
-k, --kill-after=DURATION杀死进程参数
-k, --kill-after=DURATION
also send a KILL signal if COMMAND is still running
this long after the initial signal was sent
要确保被执行的的命令完全终止,请使用-k(--kill after)选项,后面加一个时间。
当达到给定的时间限制后会强制结束(相当于kill -9或者-s sigkill)。
示例:ping命令运行一分钟,如果命令没有结束,将在10秒后完全终止命令