linux设置脚本运行超时时间,设置Linux命令或者shell脚本的运行时间限制

有些shell脚本或者命令,只有在规定时间内运行完成才有意义,这时可以设置脚本/命令的时间限制,如果在设定时间内,还没有完成,则终止命令/脚本。可以使用timeout命令来做到,先看一下它的用法:

$ man timeout

TIMEOUT(1) User Commands TIMEOUT(1)

NAME

timeout - run a command with a time limit

SYNOPSIS

timeout [OPTION] DURATION COMMAND [ARG]...

timeout [OPTION]

DESCRIPTION

Start COMMAND, and kill it if still running after DURATION.

Mandatory arguments to long options are mandatory for short options too.

--preserve-status

exit with the same status as COMMAND, even when the command times out

--foreground

When not running timeout directly from a shell prompt, allow COMMAND to read from the TTY and receive

TTY signals. In this mode, children of COMMAND will not be timed out.

-k, --kill-after=DURATION

also send a KILL signal if COMMAND is still running this long after the initial signal was sent.

-s, --signal=SIGNAL

specify the signal to be sent on timeout. SIGNAL may be a name like 'HUP' or a number. See 'kill -l'

for a list of signals

--help

display this help and exit

--version

output version information and exit

DURATION is a floating point number with an optional suffix: 's' for seconds (the default), 'm' for minutes,

'h' for hours or 'd' for days.

If the command times out, and --preserve-status is not set, then exit with status 124. Otherwise, exit with

the status of COMMAND. If no signal is specified, send the TERM signal upon timeout. The TERM signal kills

any process that does not block or catch that signal. It may be necessary to use the KILL (9) signal, since

this signal cannot be caught, in which case the exit status is 128+9 rather than 124.

BUGS

Some platforms don't curently support timeouts beyond 2038

AUTHOR

Written by Padraig Brady.

REPORTING BUGS

Report timeout bugs to bug-coreutils@gnu.org

GNU coreutils home page:

General help using GNU software:

Report timeout translation bugs to

COPYRIGHT

Copyright 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later

.

This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent per鈥[m

mitted by law.

SEE ALSO

kill(1)

The full documentation for timeout is maintained as a Texinfo manual. If the info and timeout programs are

properly installed at your site, the command

info coreutils 'timeout invocation'

should give you access to the complete manual.

GNU coreutils 8.21 March 2016 TIMEOUT(1)

示例1,假设有如下脚本,每隔一秒钟输出一次系统时间

qingsong@db2a:~$ cat infiniteloop.sh

#!/bin/bash

while true

do

echo -n "Current date: "

date

sleep 1

done

qingsong@db2a:~$ bash infiniteloop.sh

Current date: Thu Aug 17 02:48:15 PDT 2017

Current date: Thu Aug 17 02:48:16 PDT 2017

Current date: Thu Aug 17 02:48:17 PDT 2017

Current date: Thu Aug 17 02:48:18 PDT 2017

Current date: Thu Aug 17 02:48:19 PDT 2017

Current date: Thu Aug 17 02:48:20 PDT 2017

Current date: Thu Aug 17 02:48:21 PDT 2017

Current date: Thu Aug 17 02:48:22 PDT 2017

Current date: Thu Aug 17 02:48:23 PDT 2017

^C

可以看到,上面的脚本只有ctrl+c才会终止,否则会永远运行,现在可以使用timeout,设置超时限制为3秒钟:

qingsong@db2a:~$timeout 3 bash infiniteloop.sh

Current date: Thu Aug 17 02:48:35 PDT 2017

Current date: Thu Aug 17 02:48:36 PDT 2017

Current date: Thu Aug 17 02:48:37 PDT 2017

qingsong@db2a:~$

示例2,timeout命令还可以发送信号,具体怎么处理信号,由程序或者shell本身决定。下面的脚本中,对于SIGINT信号的处理方式仅仅是打印一条信息

qingsong@db2a:~$ cat infiniteloop.sh

#!/bin/bash

trap "echo received a interrupt signal" SIGINT

while true

do

echo -n "Current date: "

date

sleep 1

done

timeout命令在3s后向脚本发出一个SIGINT信号:

qingsong@db2a:~$ timeout -s SIGINT 3 bash infiniteloop.sh

Current date: Thu Aug 17 03:41:09 PDT 2017

Current date: Thu Aug 17 03:41:10 PDT 2017

Current date: Thu Aug 17 03:41:11 PDT 2017

received a interrupt signal

Current date: Thu Aug 17 03:41:12 PDT 2017

Current date: Thu Aug 17 03:41:13 PDT 2017

Current date: Thu Aug 17 03:41:14 PDT 2017

^Creceived a interrupt signal

Current date: Thu Aug 17 03:41:14 PDT 2017

Current date: Thu Aug 17 03:41:15 PDT 2017

^Creceived a interrupt signal

Current date: Thu Aug 17 03:41:16 PDT 2017

Current date: Thu Aug 17 03:41:17 PDT 2017

^Z

[1]+ Stopped timeout -s SIGINT 3 bash infiniteloop.sh

qingsong@db2a:~$ jobs

[1]+ Stopped timeout -s SIGINT 3 bash infiniteloop.sh

qingsong@db2a:~$ps -ef | grep -i infiniteloop.sh

qingsong 52631 46284 0 03:41 pts/5 00:00:00 timeout -s SIGINT 3 bash infiniteloop.sh

qingsong 52632 52631 0 03:41 pts/5 00:00:00 bash infiniteloop.sh

qingsong 52690 46284 0 03:41 pts/5 00:00:00 grep --color=auto -i infiniteloop.sh

qingsong@db2a:~$ kill -9 52631

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值