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

Monitor Process and echo if taking too long

我有一个脚本可以监控流程并在流程进行时显示(闪烁)“..请稍候..” 然后 returns“...流程完成”一旦流程完成。 如果进程超过 120 秒,我如何终止监视并输出类似 "Timeout" 的内容。 - 不终止正在进行的示例过程

#!/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

如果超时,您应该中断 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

感谢大家,我又加了一个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