当前位置: 首页 > 工具软件 > TimeOut > 使用案例 >

时间限制的命令(timeout)

钱黎明
2023-12-01

timeout是一个命令行实用程序,它运行指定的命令,如果在给定的时间段后仍在运行,则终止该命令。timeout命令是GNU核心实用程序软件包的一部分,该软件包几乎安装在所有Linux发行版中。


语法格式:
timeout [OPTION] DURATION COMMAND [ARG]...    

DURATION可以是正整数或浮点数,后跟可选的后缀:
s – 秒 (默认)
m – 分钟
h – 小时
d – 天
如果不添加任何单位,默认是秒。如果DURATION为0,则关联的超时是禁用的。

实例:

5秒后终止ping操作:

[root@localhost ~]# timeout 5 ping www.baidu.com
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=1 ttl=55 time=16.3 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=2 ttl=55 time=16.0 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=3 ttl=55 time=16.7 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=4 ttl=55 time=16.0 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=5 ttl=55 time=17.6 ms  


5分钟之后终止ping操作:
[root@localhost ~]# timeout 5m ping www.baidu.com

1天之后终止ping操作:
[root@localhost ~]# timeout 1d ping www.baidu.com

2.5秒之后终止ping操作:
[root@localhost ~]# timeout 2.5s ping www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=55 time=14.9 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=55 time=15.6 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=3 ttl=55 time=15.6 ms


发送指定的信号
如果未给出任何信号,则当达到时间限制时,timeout将SIGTERM信号发送到受管命令。可以使用-s(-signal)选项指定要发送的信号。


发送SIGKILL信号给ping命令,5秒钟后终止:

[root@localhost ~]# sudo timeout -s SIGKILL 5s ping www.baidu.com
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=1 ttl=55 time=17.2 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=2 ttl=55 time=16.6 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=3 ttl=55 time=16.7 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=4 ttl=55 time=16.2 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=5 ttl=55 time=16.7 ms
Killed


信号可以指定他的名字也可以指定他序号。下面使用的事SIGKILL的序号,5秒钟后终止操作:

[root@localhost ~]# sudo timeout -s 9 5s ping www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=55 time=15.5 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=55 time=16.3 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=3 ttl=55 time=14.9 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=4 ttl=55 time=16.0 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=5 ttl=55 time=22.0 ms
Killed


想要知道全部可用的信号,请使用 kill -l该命令查看全部的信号。

[root@localhost ~]# kill -l
 1) SIGHUP     2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT     7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV    12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN    22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX    
[root@localhost ~]#

停掉卡主的进程

SIGTERM,当超过时间限制时发送的默认信号可以被某些进程捕获或忽略。在这种情况下,进程在发送终止信号后继续运行。

要确保被执行的的命令终止,请使用-k(–kill after)选项,后面加一个时间。当达到给定的时间限制后会强制结束。

在下面的示例中,timeout命令运行一分钟,如果命令没有结束,将在10秒后终止命令:
[root@localhost ~]# timeout -k 10s 1m sh test.sh

运行在前台
默认情况下,timeout在后台运行托管命令。如果要在前台运行该命令,请使用–foreground选项:
[root@localhost ~]# timeout --foreground 5m ./script.sh

总 结
timeout命令用于运行具有时间限制的命令。通常情况下只需要给定时间限制和命令就足够了。

==============================================

SIGINT SIGTERM SIGKILL区别
三者都是结束/终止进程运行。

1.SIGINT SIGTERM区别
前者与字符ctrl+c关联,后者没有任何控制字符关联。

前者只能结束前台进程,后者则不是。

2.SIGTERM SIGKILL的区别
前者可以被阻塞、处理和忽略,但是后者不可以。KILL命令的默认不带参数发送的信号就是SIGTERM.让程序有好的退出。因为它可以被阻塞,所以有的进程不能被结束时,用kill发送后者信号,即可。即:kill-9 进程号。

 

信号是进程间通信的底层形式。

linux有标准信号32个,从32-63的信号是“实时”信号。

发送信号的原因

硬件异常:如0作为除数,内核会发送SIGFPE(信号值8)

软件异常:如进程终止时,内核会给父进程发送SIGCHLE(信号值17),窗口大小调整,应用程序会收到SIGWINCH(信号值28)


普通用户使用的信号:

信号值      符号      行为
2          SIGINT    进程终端,CTRL+C
9          SIGKILL   强制终端
15         SIGTEM    请求中断
20         SIGTOP    停止(挂起)进程 CRTL+D
 

1. kill
kill的应用是和ps 或pgrep 命令结合在一起使用的;
kill的默认信号是15,后面接的是pid号数字
kill -15 12345   //12345
 

2、pkill
kill的默认信号是15,后面接的是进程名
pkill -u user 选择用户user所拥有的进程
      -t term 选择term终端控制的进程,也可以是pst/1,pst/2等


3、killall
killall 通过程序的名字,直接杀死所有进程。
用法:killall 正在运行的程序名
killall 也和ps或pgrep 结合使用,比较方便;通过ps或pgrep 来查看哪些程序在运行;

举例:
[root@localhost beinan]# pgrep -l vi
1129 gaim
[root@localhost beinan]# killall vi


4、在top中使用k键中断


 

 类似资料: