后台运行程序有一种需求,比如查看当前进度,想在终端看到某个值的变化情况:
先提供一种很土的办法,把进度落地文件为 例如 process,采用创建写的方式。然后可以使用watch -n 1 cat process来查看进度。
这里提供两种方式,python和shell
shell版本,如下(附带一个进度条的例子)
#! /bin/bash
for ((i=0; $i<=100; i+=1))
do
printf "progress: [%-100s] %d%%\r" "xxxxxxxxxx xxx xxx" $i
sleep 1
done
function sleepPrograss(){
[ $# -eq 0 ] && echo "sleepPrograss Usage: sleepPrograss 10 "
[ $# -eq 0 ] && return 1
allTime=$1
strDone=''
stepTime=$(echo "scale=1; $allTime/100" | bc)
for ((i=0; $i<=100; i+=1))
do
printf "progress: [%-100s] %d%%\r" $strDone $i
sleep $stepTime
strDone+='#'
done
echo
}
python版本,如下(附一个多线程输出进度的例子)
基础用法示例
#! /usr/bin/env python
import os
import sys
import time
while 1:
os.write(1, "\r[%.3f]" % time.time())
sys.stdout.flush()
time.sleep(1)
子线程完成自己的任务,主线程跟踪执行进度。
#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
@filename : demo.py
@authors : U{peterguo<mailto: peterguo@tencent.com>}
@copyright: tencent
@date : 2012-11-15
@version : 1.0.0.1
'''
import os
import sys
import time
import thread
g_nTotal = 100
g_nProcessed = 0
g_fStartTime = time.time()
def simpleThdreadFun(interval):
global g_nProcessed
global g_nTotal
while g_nTotal > g_nProcessed:
time.sleep(interval)
g_nProcessed += 1
thread.exit_thread()
def test():
global g_nTotal
global g_nProcessed
global g_fStartTime
g_fStartTime = time.time()
thread.start_new_thread(simpleThdreadFun, (1,))
thread.start_new_thread(simpleThdreadFun, (2,))
thread.start_new_thread(simpleThdreadFun, (3,))
thread.start_new_thread(simpleThdreadFun, (4,))
while True:
time.sleep(0.5)
fRunTime = time.time() - g_fStartTime
nLeftNum = g_nTotal - g_nProcessed
fLeftTime = fRunTime * nLeftNum / (g_nProcessed + 0.1)
fPrograss = 100.0 * g_nProcessed / g_nTotal
os.write(1, "\rLeftTime[%.3f]\tLeftNum[%d]\tProgress[%.3f %% (%d/%d) ]" %
(fLeftTime, nLeftNum, fPrograss, g_nProcessed, g_nTotal))
sys.stdout.flush()
if g_nTotal <= g_nProcessed:
break
print "\nTest Done, use %.3f seconds" % (time.time() - g_fStartTime)
if __name__=='__main__':
test()
来源:oschina
链接:https://my.oschina.net/u/123914/blog/89294