免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13783 | 回复: 11

【已解决】python写的循环脚本,记录结果写入日志无法实时输出的问题 [复制链接]

论坛徽章:
0
发表于 2014-06-18 17:26 |显示全部楼层
本帖最后由 c386 于 2014-06-19 13:15 编辑

下午写了一个脚本,运行在Window下,每10秒telnet对端服务器端口
如果telnet成功,则在D:\1.log 中记1 和时间
如果telnet失败,则在D:\1.log 中记0 和时间

现在问题是,因为是在Windows下,D:\1.log这个日志文件并不能每10秒更新内容,必须要结束Python脚本后,1.log日志文件中才会出现从开始执行到结束脚本执行这段时间的内容
我的理解:因为是循环执行,Python进程会将telnet的结果保存在内存中,执行结束后再释放。那么:
1、看网上说貌似可以用subprocess来实现,但是不知道如何来写,求各位大大指点
2、无论用不用subprocess来实现,脚本运行时间长了会不会造成内存溢出?
谢谢!



脚本(Python2.7):

#encoding=utf-8  
import sys
import telnetlib
import time;

HOST="192.168.1.100"
f=file(r'D:\1.log','a')

while(1):
    time.sleep(10)
    NOW=time.strftime('%Y-%m-%d_%H:%M:%S',time.localtime(time.time()))
    try:
        tn = telnetlib.Telnet(HOST,port=80,timeout=10)
        result = '1   ' + NOW + '\n'
        tn.close()
        sys.stdout.flush()
        f.write(result)
        f.close
    except:
        result = '0   ' + NOW + '\n'
        f.write(result)
        f.close


D:\1.log:
16:48分运行脚本,50分结束脚本后,才出现内容

1   2014-06-18_16:48:43
1   2014-06-18_16:48:53
1   2014-06-18_16:49:03
1   2014-06-18_16:49:13
1   2014-06-18_16:49:23
1   2014-06-18_16:49:33
1   2014-06-18_16:49:43
1   2014-06-18_16:49:53
1   2014-06-18_16:50:03
1   2014-06-18_16:50:13
1   2014-06-18_16:50:23

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
发表于 2014-06-18 18:09 |显示全部楼层
回复 1# c386
应该是可以用:flush()把对应的信息强制写入磁盘文件的,不需要反复close()的。

论坛徽章:
0
发表于 2014-06-19 13:15 |显示全部楼层
icymirror 发表于 2014-06-18 18:09
回复 1# c386
应该是可以用:flush()把对应的信息强制写入磁盘文件的,不需要反复close()的。



谢谢指点!!

    try:
        tn = telnetlib.Telnet(HOST,port=80,timeout=10)
        result = '1   ' + NOW + '\n'
        tn.close()
        sys.stdout.flush()
        f.write(result)
        f.close
    except:
        result = '0   ' + NOW + '\n'
        f.write(result)
        f.close

修改为

    try:
        tn = telnetlib.Telnet(HOST,port=80,timeout=10)
        result = '1   ' + NOW + '\n'
        tn.close()
        f.write(result)
        f.flush()
            
    except:
        result = '0   ' + NOW + '\n'
        f.write(result)
        f.flush()

就可以实现了!

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
发表于 2014-06-23 15:44 |显示全部楼层
Python的操作文件方式,肯定有一个追加模式,这个模式就是用来写日志等特殊功能的,可惜你代码中没有用。
代码并不是完成功能就行,还得看看专业不专业,有没有隐患,这只能依靠知识面和积累了。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-16 06:20:00
发表于 2014-06-24 19:17 |显示全部楼层
是不是追加模式,应该不用flush的话都不会对磁盘操作的。所以肯定得用flush或者close这样的操作。才能正式对磁盘写入。。。回复 4# linustd


   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
发表于 2014-06-25 07:15 |显示全部楼层
回复 5# nathanielwen


flush不flush不重要,关键是写日志这样的操作,必须是追加模式,这是一个要点,也是一个重点,就能看出写程序这人的水平和见识面。

就算不flush,写入的日志最后肯定是能存到文件的。大不了就是有一些延迟,这不算什么,毕竟日志不是实时的程序。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-16 06:20:00
发表于 2014-06-25 17:12 |显示全部楼层
首先,程序里面本来用的就是追加模式,其次,你考虑过一个问题没有,如果你没有flush,东西还在内存里,然后现在机器突然因为某原因断电了。内存里的东西你打算怎么办?什么时候可以写到磁盘里面?回复 6# linustd


   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
发表于 2014-06-25 17:16 |显示全部楼层
nathanielwen 发表于 2014-06-25 17:12
首先,程序里面本来用的就是追加模式,其次,你考虑过一个问题没有,如果你没有flush,东西还在内存里,然后 ...


看看,你对操作系统不了解了吧,一个OS上文件的打开、读写、加锁、缓存等,都是线程安全的,为啥捏? 因为是操作系统负责了这个任务。

你写入文件内容,还没有写入硬盘时,就算你的程序崩溃了,也没问题,因为操作系统帮你缓存着你写入的东西。 只要操作系统没崩溃,没突然断电,那就没事。

另外写日志本来就不是一个实时任务,不能要求日志都是实时的。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
发表于 2014-06-25 17:19 |显示全部楼层
另外LINUX系统等还有一个好处,就是系统会定时刷新文件缓存到硬盘,好像是2秒。也就是说,只要你写入文件,虽然没有flush,但是2秒后,你再断电关机,照样不丢失数据。

Linux系统有一个定时任务计划,每隔2S就刷新所有文件的缓存。当然我只是听说这么一个机制,具体细节不太清楚。说不定这个时间间隔还能配置。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-16 06:20:00
发表于 2014-06-25 17:26 |显示全部楼层
呵呵。断电了。哪怕是0.01秒的数据丢了。你负责么?写程序本来就不是为了考虑最理想的状况。回复 9# linustd


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP