shell脚本超时

时间:2014-11-21 09:45:19

标签: shell

我想在我的shell脚本中放置超时,以便在其中完成进程,例如,如果我想scp一个文件,如果该文件没有通过错误在超时内转移,如果成功回应成功消息,怎么放超时?

2 个答案:

答案 0 :(得分:1)

使用timeout(1)。比你必须编写,调试和维护的自制解决方案要好得多。

答案 1 :(得分:0)

以此为例:

command &    # start a new process in background
pid=$(pidof command | cut -f1 -d' ')    # save pid of started process
sleep(timeout_value)    # set timeout value to match your desired time to process
pids=$(pidof command)    # get all pids of running processes of this command
if [[ $(grep "$pid" "$pids") ]]; then    # if started process still running
    echo "error"
else
    echo "success"
fi

更改word命令以匹配您的实际命令。我不确定这是否适用于管道,我会在一分钟内测试它并回复给您。

对于管道命令,您可以执行以下操作(前提是您使用bash执行):

(command | other_command | ...) &
pid=$(pidof bash | cut -f1 -d' ')    # save pid of started process
sleep(timeout_value)    # set timeout value to match your desired time to process
pids=$(pidof bash)    # get all pids of running bash processes
if [[ $(grep "$pid" "$pids") ]]; then    # if started process still running 
    echo "error"
else
    echo "success"
fi

<强>问题

请注意,有更好的答案,因为此脚本将始终等待整个超时。这可能不是你想要的。

可能的解决方案

一种可能的解决方案是多次睡眠,如下所示:

for i in $(seq 1..100); do
    sleep(timeout/100)  # sample the timeout interval
    pids=$(pidof bash)
    if [[ $(grep -v "$pid" "$pids") ]]; then   # if process no longer running
        echo "succes" && exit 0     # process completed, success!
    elif [[ $i -eq 100 ]]; then
        echo "error"    # at the end of our timeout
    fi
done

注意:如果超时很长,请更改值100,尝试优化它,以便每次迭代的超时时间不会太长。