popen.stdout.readline()无法读取数据

PaperStar 2014-09-23 01:28:27
最近想写一个脚本实时监控Tomcat的日志文件,第一次使用python,请大家多多指点

我写的代码如下


import subprocess

command='tail -f /opt/deployment/apache-tomcat-7.0.42/logs/catalina.out |grep "ERROR"'
popen=subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,shell=True)
while True:
line = popen.stdout.readline()
print line


代码总是停在popen.stdout.readline()这一行而不再输出,但是日志文件中明明已经存在ERROR数据。
尝试后发现只有大量存在ERROR数据时才会进行输出,一两行的报错信息根本就没反应。
我的理解是存在一定的缓存,只有输出一定数据量时才会传到管道中
如何让出现ERROR数据时便能实时进行输出?

或者有其他方法对日志文件进行监控也可以。

请大家不吝赐教,谢谢!
...全文
1983 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
湖心亭看雪 2017-03-04
  • 打赏
  • 举报
回复
感谢五楼的正解啊,,请问这种问题你是怎么尝试出来的呢?@angel_su
angel_su 2014-09-26
  • 打赏
  • 举报
回复
如果只是打印结果,那么不用python直接命令行。如果是需要python干其他事那么照你后来的不用grep...
PaperStar 2014-09-26
  • 打赏
  • 举报
回复
引用 5 楼 angel_su 的回复:
实际试了下,卡在grep,要加个参数... | grep --line-buffered "ERROR"
棒棒棒!问题解决,太感谢了。 为什么我按ctrl+C退出时是卡在popen.stdout.readline() ?你是怎么发现问题在grep呢? 还有就是,我现在是直接用tail -f /opt/deployment/apache-tomcat-7.0.42/logs/catalina.out 然后readline() 然后‘ERROR’ in readlin()这样运行的 这种方式和加grep条件哪个好呢?哪种系统开销会小一些?
PaperStar 2014-09-26
  • 打赏
  • 举报
回复
引用 7 楼 angel_su 的回复:
如果只是打印结果,那么不用python直接命令行。如果是需要python干其他事那么照你后来的不用grep...
肯定还有其他任务啊。明白了,谢谢。
angel_su 2014-09-25
  • 打赏
  • 举报
回复
实际试了下,卡在grep,要加个参数... | grep --line-buffered "ERROR"
angel_su 2014-09-23
  • 打赏
  • 举报
回复 1
执行的时候加-u参数试试... python -u yourscript.py
PaperStar 2014-09-23
  • 打赏
  • 举报
回复
引用 2 楼 selecthis 的回复:



import subprocess

command='tail -f /opt/deployment/apache-tomcat-7.0.42/logs/catalina.out  |grep "ERROR"'  
popen= subprocess.Popen(command, stdout=subprocess.PIPE)
while True:
	for line in iter(popen.stdout.readline, ''):
		print line,
不加shell=True会报错。 加上后代码停在for line in iter(popen.stdout.readline, ''):这一行 少量ERROR无输出,制造大量ERROR后会输出,但仍不是全部输出 测试结果和原代码无区别。 会不会是python的版本问题,使用的python是2.6.6
李察德-泰森 2014-09-23
  • 打赏
  • 举报
回复



import subprocess

command='tail -f /opt/deployment/apache-tomcat-7.0.42/logs/catalina.out  |grep "ERROR"'  
popen= subprocess.Popen(command, stdout=subprocess.PIPE)
while True:
	for line in iter(popen.stdout.readline, ''):
		print line,
李察德-泰森 2014-09-23
  • 打赏
  • 举报
回复


import subprocess

command='tail -f /opt/deployment/apache-tomcat-7.0.42/logs/catalina.out  |grep "ERROR"'  
popen= subprocess.Popen(command, stdout=subprocess.PIPE)
while True:
	for line in iter(pipe.stdout.readline, ''):
		print line,

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧