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

前端之家收集整理的这篇文章主要介绍了如何限制BASH脚本的运行时间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个长时间运行的BASH脚本,我在Windows上运行CYGWIN。

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

例如:

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

要么

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

在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@H_403_6@

猜你在找的Bash相关文章