c386 发表于 2014-06-18 17:26

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

本帖最后由 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

icymirror 发表于 2014-06-18 18:09

回复 1# c386
应该是可以用:flush()把对应的信息强制写入磁盘文件的,不需要反复close()的。

c386 发表于 2014-06-19 13:15

icymirror 发表于 2014-06-18 18:09 static/image/common/back.gif
回复 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()

就可以实现了!

linustd 发表于 2014-06-23 15:44

Python的操作文件方式,肯定有一个追加模式,这个模式就是用来写日志等特殊功能的,可惜你代码中没有用。
代码并不是完成功能就行,还得看看专业不专业,有没有隐患,这只能依靠知识面和积累了。

nathanielwen 发表于 2014-06-24 19:17

是不是追加模式,应该不用flush的话都不会对磁盘操作的。所以肯定得用flush或者close这样的操作。才能正式对磁盘写入。。。回复 4# linustd


   

linustd 发表于 2014-06-25 07:15

回复 5# nathanielwen


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

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

nathanielwen 发表于 2014-06-25 17:12

首先,程序里面本来用的就是追加模式,其次,你考虑过一个问题没有,如果你没有flush,东西还在内存里,然后现在机器突然因为某原因断电了。内存里的东西你打算怎么办?什么时候可以写到磁盘里面?回复 6# linustd


   

linustd 发表于 2014-06-25 17:16

nathanielwen 发表于 2014-06-25 17:12 static/image/common/back.gif
首先,程序里面本来用的就是追加模式,其次,你考虑过一个问题没有,如果你没有flush,东西还在内存里,然后 ...

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

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

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

linustd 发表于 2014-06-25 17:19

另外LINUX系统等还有一个好处,就是系统会定时刷新文件缓存到硬盘,好像是2秒。也就是说,只要你写入文件,虽然没有flush,但是2秒后,你再断电关机,照样不丢失数据。

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

nathanielwen 发表于 2014-06-25 17:26

呵呵。断电了。哪怕是0.01秒的数据丢了。你负责么?写程序本来就不是为了考虑最理想的状况。回复 9# linustd


   
页: [1] 2
查看完整版本: 【已解决】python写的循环脚本,记录结果写入日志无法实时输出的问题