atexit函数介绍可参考python 之atexit 模块学习
atexit可以在程序正常结束运行退出时调用(异常报错中断不会调用),除此之外,atexit 也可以捕捉sys.exit(), os._exit()等退出的情况。当程序出现这些终止或退出时,系统在退出之前会执行atexit函数。若程序结束前需要对一些数据进行处理则可以使用该函数。
该实例编写了一个telnet多个站点并获取结果的过程,在该过程中使用atexit获取运行结束时telnet成功率。由于该程序可能存在ctrl+c终止程序的情况,所以设计程序时也使用了try…except…来捕获异常退出时也能正常处理数据。关于该脚本部分详细解析可参考:python编写脚本通过telnet监控站点状态
- [Others]
;访问次数
run_times = 10000
;每次访问间隔时间
sleep_time = 30
;站点列表
[web1]
;站点域名或IP
host = 192.168.20.1
;端口
port = 80
;telnet超时时间
timeout = 5
[web2]
host = 192.168.20.2
port = 80
timeout = 5
import codecs
import telnetlib
import time
import traceback
import configparser
import atexit
config = configparser.ConfigParser()
config.read('config.ini', encoding="utf-8")
webs = config.sections()
run_times = int(config.get('Others', 'run_times')) # 循环次数
sleep_time = int(config.get('Others', 'sleep_time')) # 间隔时间
def get_accuracy(right_times, all_times):
fp = codecs.open("telnet_log.txt", 'a', 'utf-8') # 如果有这个文件就打开,如果没有这个文件就创建一个名叫telnet_log的txt文件
fp.write('返回运行总次数:' + str(all_times) + '\n')
fp.write('返回每个站点正确次数:' + str(right_times) + '\n')
fp.close()
for x in range(1, len(webs)):
host = config.get(webs[x], 'host')
accuracy = (right_times[x-1]/all_times)
print(host+'正确率:{:.2%}'.format(accuracy))
fp = codecs.open("telnet_log.txt", 'a', 'utf-8') # 如果有这个文件就打开,如果没有这个文件就创建一个名叫telnet_log的txt文件
fp.write(host+'正确率:{:.2%}'.format(accuracy) + '\n')
fp.close()
def telnet_webs():
try:
right_times = [0 for x in range(1, len(webs))]
all_times = 1
for i in range(1, run_times):
for j in range(1, len(webs)):
try:
# 连接Telnet服务器
host = config.get(webs[j], 'host')
port = config.get(webs[j], 'port')
timeout = int(config.get(webs[j], 'timeout'))
tn = telnetlib.Telnet(host, port, timeout=timeout)
print('telnet '+host+' '+port+' Success:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '\n')
fp = codecs.open("telnet_log.txt", 'a', 'utf-8') # 如果有这个文件就打开,如果没有这个文件就创建一个名叫telent_log的txt文件
fp.write('telnet '+host+' '+port+' Success:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '\n')
right_times[j-1] = right_times[j-1] + 1
fp.close()
tn.close()
except:
print('telnet '+host+' '+port+' Failed:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '\n')
fp = codecs.open("telnet_log.txt", 'a', 'utf-8') # 如果有这个文件就打开,如果没有这个文件就创建一个名叫telnet_log的txt文件
fp.write('telnet '+host+' '+port+' Failed:' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + '\n')
fp.close()
traceback.print_exc(file=open('telnet_error_log.txt', 'a+')) # python运行报错日志记录到telnet_error_log.txt
time.sleep(sleep_time)
all_times = all_times+1
except Exception as errorMsg:
print('程序异常中断%s' % errorMsg)
finally:
print('返回运行总次数:', all_times)
print('返回每个站点正确次数:', right_times)
return right_times, all_times
if __name__ == '__main__':
res = telnet_webs()
right_times = res[0]
all_times = res[1]
atexit.register(get_accuracy, right_times, all_times)