zoukankan      html  css  js  c++  java
  • shell中timeout实现

    第一种

    function timeout() {
    waitsec=$SLEEP_TIME
    ( $* ) & pid=$!
    ( sleep $waitsec && kill -HUP $pid ) 2>/dev/null & watchdog=$!
    # if command finished
    if wait $pid 2>/dev/null; then
        pkill -HUP -P $watchdog
        wait $watchdog
    fi
    # else: command interrupted
    }
    
    

    第二种

    function timeout()
    {
        local time cmd pid
    
        if echo "$1" | grep -Eq '^[0-9]+'; then
            time=$1
            shift && cmd="$@"
        else
            time=5
            cmd="$@"
        fi
    
        $cmd &
        pid=$!
    
        while kill -0 $pid &>/dev/null; do
            sleep 1
            let time-=1
    
            if [ "$time" = "0" ]; then
                kill -9 $pid &>/dev/null
                wait $pid &>/dev/null
            fi
        done
    }
    

    假设有一个测试脚本sleep.sh:

    $ cat sleep.sh
    echo "sleep $1 seconds"
    sleep $1
    echo "awake from sleep"
    

    现在利用我们写的timeout函数来达到超时kill功能:

    $ time sh timeout.sh 2 'sh sleep.sh 100'
    sleep 100 seconds
    
    real    0m2.005s
    user    0m0.002s
    sys 0m0.001s
    

    看最终执行的时间,差不多就是2秒钟。

    上面timeout函数实现的代码中,利用了两个技巧:

    1. kill -0 $pid:发送信号0给进程,可以检查进程是否存活,如果进程不存在或者没有权限,则返回错误,错误码为1;
    2. wait $pid &>/dev/null:等待某个进程退出返回,这样相对比较优雅,同时将错误重定向到黑洞,从而隐藏后台进程被kill的错误输出;
  • 相关阅读:
    python yaml文件数据按原有的数据顺序dump
    HTMLTestRunner
    os.path获取当前路径及父路径
    update 字符串拼接
    VSCode 快速生成.vue基本模板、发送http请求模板
    Vue取消eslint语法限制
    node-sass安装失败解决方法
    docker 创建mysql和redis
    阿里云镜像加速器地址
    .net core + xunit 集成测试
  • 原文地址:https://www.cnblogs.com/muahao/p/6252531.html
Copyright © 2011-2022 走看看