03.04 Linux中運行有時間限制的命令(timeout)

timeout是一個命令行實用程序,它運行指定的命令,如果在給定的時間段後仍在運行,則終止該命令。timeout命令是GNU核心實用程序軟件包的一部分,該軟件包幾乎安裝在所有Linux發行版中

如 何 使 用

語法格式:

<code>timeout [OPTION] DURATION COMMAND [ARG]...    /<code>

DURATION可以是正整數或浮點數,後跟可選的後綴:

  • s – 秒 (默認)
  • m – 分鐘
  • h – 小時
  • d – 天

如果不添加任何單位,默認是秒。如果DURATION為0,則關聯的超時是禁用的。

實例

5秒後終止ping操作:

<code>[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  /<code>
Linux中運行有時間限制的命令(timeout)

5分鐘之後終止ping操作:

<code>[root@localhost ~]# timeout 5m ping www.baidu.com/<code>

1天之後終止ping操作:

<code>[root@localhost ~]# timeout 1d ping www.baidu.com/<code>

2.5秒之後終止ping操作:

<code>[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/<code>
Linux中運行有時間限制的命令(timeout)

發送指定的信號

如果未給出任何信號,則當達到時間限制時,timeout將SIGTERM信號發送到受管命令。可以使用-s(-signal)選項指定要發送的信號。

發送SIGKILL信號給ping命令,5秒鐘後終止:

<code>[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/<code>
Linux中運行有時間限制的命令(timeout)

信號可以指定他的名字也可以指定他序號。下面使用的事SIGKILL的序號,5秒鐘後終止操作:

<code>[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/<code>
Linux中運行有時間限制的命令(timeout)

想要知道全部可用的信號,請使用 kill -l該命令查看全部的信號。

<code>[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 ~]#/<code>
Linux中運行有時間限制的命令(timeout)

停掉卡主的進程


SIGTERM,當超過時間限制時發送的默認信號可以被某些進程捕獲或忽略。在這種情況下,進程在發送終止信號後繼續運行。

要確保被執行的的命令終止,請使用-k(--kill after)選項,後面加一個時間。當達到給定的時間限制後會強制結束。

在下面的示例中,timeout命令運行一分鐘,如果命令沒有結束,將在10秒後終止命令:

<code>[root@localhost ~]# timeout -k 10s 1m sh test.sh/<code>

運 行 在 前 臺


默認情況下,timeout在後臺運行託管命令。如果要在前臺運行該命令,請使用--foreground選項:

<code>[root@localhost ~]# timeout --foreground 5m ./script.sh/<code>

總 結


timeout命令用於運行具有時間限制的命令。通常情況下只需要給定時間限制和命令就足夠了。


分享到:


相關文章: