微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何限制BASH脚本的运行时间

我有一个长时间运行的BASH脚本,我在Windows上运行CYGWIN。

我想限制脚本运行30秒,如果超过此限制,则自动终止。理想情况下,我希望能够对任何命令执行此操作。

例如:

sh-3.2$ limittime -t 30 'myscript.sh'

要么

sh-3.2$ limittime -t 30 'grep func *.c'

在cygwin下,ulimit命令似乎不起作用。

我愿意接受任何想法。

请参阅 http://www.pixelbeat.org/scripts/timeout脚本,其功能已集成到较新的coreutils中:
#!/bin/sh

# Execute a command with a timeout

# License: LGPLv2
# Author:
#    http://www.pixelbeat.org/
# Notes:
#    Note there is a timeout command packaged with coreutils since v7.0
#    If the timeout occurs the exit status is 124.
#    There is an asynchronous (and buggy) equivalent of this
#    script packaged with bash (under /usr/share/doc/ in my distro),#    which I only noticed after writing this.
#    I noticed later again that there is a C equivalent of this packaged
#    with satan by Wietse Venema,and copied to forensics by Dan Farmer.
# Changes:
#    V1.0,Nov  3 2006,Initial release
#    V1.1,Nov 20 2007,Brad Greenlee <brad@footle.org>
#                       Make more portable by using the 'CHLD'
#                       signal spec rather than 17.
#    V1.3,Oct 29 2009,Ján Sáreník <jasan@x31.com>
#                       Even though this runs under dash,ksh etc.
#                       it doesn't actually timeout. So enforce bash for Now.
#                       Also change exit on timeout from 128 to 124
#                       to match coreutils.
#    V2.0,Oct 30 2009,Ján Sáreník <jasan@x31.com>
#                       Rewritten to cover compatibility with other
#                       Bourne shell implementations (pdksh,dash)

if [ "$#" -lt "2" ]; then
    echo "Usage:   `basename $0` timeout_in_seconds command" >&2
    echo "Example: `basename $0` 2 sleep 3 || echo timeout" >&2
    exit 1
fi

cleanup()
{
    trap - ALRM               #reset handler to default
    kill -ALRM $a 2>/dev/null #stop timer subshell if running
    kill $! 2>/dev/null &&    #kill last job
      exit 124                #exit with 124 if it was running
}

watchit()
{
    trap "cleanup" ALRM
    sleep $1& wait
    kill -ALRM $$
}

watchit $1& a=$!         #start the timeout
shift                    #first param was timeout for sleep
trap "cleanup" ALRM INT  #cleanup after timeout
"$@"& wait $!; RET=$?    #start the job wait for it and save its return value
kill -ALRM $a            #send ALRM signal to watchit
wait $a                  #wait for watchit to finish cleanup
exit $RET                #return the value

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐