如果花费太长时间,监视进程并回显

时间:2015-06-05 09:34:11

标签: bash shell ksh

我有一个脚本监视进程并在进程正在进行时显示(闪烁)“..Please Wait ..” 完成流程后返回“...流程完成”。 如果进程超过120秒,如何终止监视并输出类似“超时”的内容。   - 不终止正在进行的示例流程

#!/usr/bin/ksh
sleep 160 &  # Example process
pid=$!
echo 'Getting data\r\c'
sleep 2
while kill -0 $pid 2>/dev/null
do
echo '...Please Wait..\r\c'
sleep 1
echo '                \r\c'
sleep 1
done
echo '...Process complete\r\c'
sleep 2
exit

2 个答案:

答案 0 :(得分:1)

如果超时,你应该打破while循环。

...
TIMEOUT=120
START_TIME=`date +%s`   # seconds since 1970-01-01 00:00:00 UTC
END_TIME=$(( $START_TIME + $TIMEOUT ))
...
while kill -0 $pid 2>/dev/null; do
    #break if current timestamp is greater than precalculated END_TIME
    if [ `date +%s` -gt "$END_TIME" ]; then
        echo "Timeout"
        exit;
    fi
    ...
done

可以选择使用短路评估代替if语句。像这样:

[ `date +%s` -gt "$END_TIME" ] && echo "Timeout" && exit

答案 1 :(得分:0)

感谢大家,我添加了另一个while循环。

#!/usr/bin/ksh
TIMEOUT=15
START_TIME=`date +%s`   # seconds since 1970-01-01 00:00:00 UTC
END_TIME=$(( $START_TIME + $TIMEOUT ))
while
do
    sleep 60 &
    pid=$!
    echo 'Getting data\r\c'
    sleep 2
    while kill -0 $pid 2>/dev/null
    do
       START_TIME=`date +%s`
       echo '...Please Wait..\r\c'
       sleep 1
       echo '                \r\c'
       sleep 1
       if [ `date +%s` -gt "$END_TIME" ]; then
         echo '...timeout\r\c'
         break 2
       fi
    done   
    echo '...Process complete\r\c'
    sleep 1
    break 
done