天天看點

傳播小知識:timeout限制時間指令

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

Linux中運作有時間限制的指令(timeout)Linux中運作有時間限制的指令(timeout)

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

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=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

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

想要知道全部可用的信号,請使用 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指令用于運作具有時間限制的指令。通常情況下隻需要給定時間限制和指令就足夠了。

繼續閱讀