如何在运行命令时设置超时时间

时间:2019-04-29 03:17:16  来源:igfitidea点击:

如何在Linux上执行命令时限制其时间,如果在给定的时间后还在运行,则将进程杀掉?

Linux中有一个timeout的命令,它可以限制一个命令的运行时间。 另外还可以使用bash和perl语法实现

Linux时间限制命令 - 使用timeout

timeout的语法

timeout DURATION COMMAND
timeout DURATION COMMAND arg1 arg2
timeout [options] DURATION COMMAND arg1 arg2

DURATION是设置超时时间,单位可以是:

  • s 秒(默认)
  • m 分钟
  • h 小时
  • d 天

如何运行ping命令并在30秒后中止它

date
timeout 30s ping www.baidu.com
timeout 30s ping 192.168.1.22
date

或者

ping www.baidu.com & sleep 30s; kill $!

使用timeout的时候如何指定信号(默认是杀掉进程)

语法:

timeout -s 9 YourCommandHere
timeout --signal=9 YourCommandHere
timeout -s 9 2m tail -F /var/log/secure
timeout -s 15 10s tracepath baidu.com

示例- 发送SIGTERM 作为终止信号

timeout -s SIGTERM 10s ping baidu.com

timeout如何设置宽限期

应用场合:linux中一个程序先执行正常的关闭程序,如果超过指定进程还在,则将进程杀掉。

使用 -k 或者 --kill-after=DURATION选项

timeout -k=5 2m command1 arg1

例如 如果COMMAND1在发送初始信号SIGTERM后5秒还在运行,则发送终止信号SIGKILL:

timeout -k=5 -s SIGTERM 2m /path/to/my-app arg1 arg2

查看linux中的所有信号量

# 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

Linux设置命令运行的时间 - 使用bash实现

MyCoolCommand Arg1 & read -t TIMEOUT_VALUE || kill $!

## 示例
command arg1 & read -t 30 || kill $!
ping 192.168.2.254 & read -t 10 || kill $!
tail -F /var/log/secure & read -t 60 || kill $!

Linux设置命令运行的时间 - 使用perl实现

## define doalarm() shell  ##
doalarm() { perl -e 'alarm shift; exec @ARGV' -- "$@"; }
 
## 30秒后超时 ##
doalarm 600 vim /path/to/demo.py
 
## ping10秒后超时 ##
doalarm 10 ping baidu.com