关于 tail -f | python 的问题

64 views
Skip to first unread message

john

unread,
Feb 8, 2010, 8:14:00 PM2/8/10
to pyth...@googlegroups.com
我想实时监控系统日志(比方说mail.log),打算采取将 tail 的结果通过管道传给 a.py 来分析。
如果是 tail mail.log | python a.py 这种方式没有问题。
print sys.stdin.read()

但如果 tail -f mail.log | python a.py ,采取这种方法的话,这种方法不好用(没有输出)。
请问各位,这种情况下应该怎么做呢?

不知道我的问题叙述清楚了没有。

Xin LI

unread,
Feb 8, 2010, 8:21:42 PM2/8/10
to pyth...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2010/02/08 17:14, john wrote:
> ����ʵʱ���ϵͳ��־���ȷ�˵mail.log��,�����ȡ�� tail �Ľ��ͨ��ܵ4�
> �� a.py 4����
> ����� tail mail.log | python a.py ���ַ�ʽû�����⡣
> print sys.stdin.read()
>
> ����� tail -f mail.log | python a.py ,��ȡ���ַ����Ļ������ַ���������
> ��û������
> ���ʸ�λ�����������Ӧ����ô���أ�
>
> ��֪���ҵ��������������û�С�

��>ת���ļ�����|��tee��

û�����Ϊʲô��û�����

- --
Xin LI <del...@delphij.net> http://www.delphij.net/
FreeBSD - The Power to Serve! Live free or die
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (FreeBSD)

iQEcBAEBAgAGBQJLcLimAAoJEATO+BI/yjfBE6cH/2FJ7oqdMv6IYjkHun1sooQL
SHBdpotdufZNC7p7FjHCyRIayDgLefi75ix0FwaH8jn25Xfl3lewuXhLFoD4HTa3
J5AO+8BJ6duQwppwrSEHOP4aqbdFuok6tXndsztmSR+aSmhQU8b0oG4Bbc0gVJEO
XShUrOlOWScDlOqmgjqscB3GxFy7ar3jSW2oFYJS7FHPyW/kapdnhWtr+q5CdaLI
4zM63tk1uNtIxXNa5ye11jC2M1gnOnnTGv7s4XuBnnHnPlGm6XjR1ZWhuR+e9gNt
sN67C4ZsS7gXsFm2jxI96uLzbmbttMAUfgiRyqKadb4RqNNf6zeNpAM1j+bxc5Y=
=wQ6k
-----END PGP SIGNATURE-----

黄毅

unread,
Feb 8, 2010, 8:24:24 PM2/8/10
to python-cn
~> cat temp.py
while True:
    print raw_input()
~> tail -f data.txt | python temp.py &
[2] 21980
~> aaa
bbb
ccc
ddd
ddd
eee

~> echo fff >> data.txt
~> fff

试验了一下,这个方法没有问题,楼主需要具体描述一下遇到什么问题。

2010/2/9 john <john....@gmail.com>

--
来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com
退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com/4dg6hc
详情: https://groups.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp



--
http://codeplayer.blogspot.com/

john

unread,
Feb 8, 2010, 8:26:35 PM2/8/10
to pyth...@googlegroups.com
a.py 的内容是:
print sys.stdin.read()

>>>tail -f mail.log | python a.py
这里一直没有输出,即使我手工往mail.log的最后添加内容并保存。

Zoom.Quiet

unread,
Feb 8, 2010, 8:27:21 PM2/8/10
to pyth...@googlegroups.com
2010/2/9 Xin LI <del...@delphij.net>:

> On 2010/02/08 17:14, john wrote:
>> 我想实时监控系统日志(比方说mail.log),打算采取将 tail 的结果通过管道传

>> 给 a.py 来分析。
>> 如果是 tail mail.log | python a.py 这种方式没有问题。
>> print sys.stdin.read()
>>
>> 但如果 tail -f mail.log | python a.py ,采取这种方法的话,这种方法不好用
>> (没有输出)。
>> 请问各位,这种情况下应该怎么做呢?
>>
>> 不知道我的问题叙述清楚了没有。
>
> 用>转到文件或者|给tee?
>
> 没看明白为什么会没有输出。
>
最好给出你的 a.py 代码
在 UNIX 中 pipe 是个I/O 级别的转发,
如果你的 .py 没有合理的持续的I/O 处理,一定是没有反应的了...


> - --
> Xin LI <del...@delphij.net>    http://www.delphij.net/
> FreeBSD - The Power to Serve!          Live free or die


--
http://zoomquiet.org 人生苦短? Pythonic!
KM乃是培育可催生自学习型组织的文化氛围! (KM=Knowledge Management=知识管理)

Xin LI

unread,
Feb 8, 2010, 8:29:52 PM2/8/10
to pyth...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2010/02/08 17:26, john wrote:
> a.py �������ǣ�


> print sys.stdin.read()
>
>>>>tail -f mail.log | python a.py

> ����һֱû������ʹ���ֹ���mail.log�����������ݲ����档

- -f�Ļ����inode�����Dz���follow�ģ���������Կ���

echo "foo" >> mail.log

���⻹��һ�����������ΪI/O���壬������Ϊֻ��һ��|Ӧ�ò�����������⡣

Cheers,


- --
Xin LI <del...@delphij.net> http://www.delphij.net/
FreeBSD - The Power to Serve! Live free or die
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (FreeBSD)

iQEcBAEBAgAGBQJLcLqQAAoJEATO+BI/yjfBsoIH/A/7BGIS6m1D0prMdyw0Q2Zv
JhMjTkslvcCmRJ01zpYA/g5tihCytCAlgG8Z8Vc6be+R8MkPSXiKzW12Hg9ia+zO
nshcSYeNU0mW3upVXE3RsZ4gYVw3H4L/rbmCil2uJ21N/9+PoAT+I1a/yXUeYx2C
H83vYOrinjhEYn6crA5VE9uGR5VGvwK4YovyY1Y33GQ3IP8ljeJcRNb95t1+amit
aJUPBBiJUTCBQ+xkI9+BaDc16rLVVExl3DvNtJYShYo6h0fZ+ePUTLWQKN8JGyH0
wa47HCLKvhb81cq+ocaU/VH1doxZTqqICiMMR3Z/INmdPyZVcbv4WoOPTmOUpjY=
=70nE
-----END PGP SIGNATURE-----

amingsc

unread,
Feb 8, 2010, 8:31:38 PM2/8/10
to pyth...@googlegroups.com
能在a.py脚本中循环地 tail -xx mail.log 来获取日志更新不?我知道我们这儿有perl脚本是这么来监控日志的

黄毅

unread,
Feb 8, 2010, 8:32:19 PM2/8/10
to python-cn
你应该 readline ,read 会一直读到 EOF 才返回的,所以一直阻塞了。

2010/2/9 john <john....@gmail.com>

--
来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com
退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com/4dg6hc
详情: https://groups.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp



--
http://codeplayer.blogspot.com/

Xin LI

unread,
Feb 8, 2010, 8:35:10 PM2/8/10
to pyth...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2010/02/08 17:32, ���� wrote:
> ��Ӧ�� readline ��read ��һֱ�u� EOF �ŷ��صģ�����һֱ�����ˡ�

¥����⣬Ӧ����������⡣

> 2010/2/9 john <john....@gmail.com <mailto:john....@gmail.com>>
>
> a.py �������ǣ�


> print sys.stdin.read()
>
> >>>tail -f mail.log | python a.py

> ����һֱû������ʹ���ֹ���mail.log�����������ݲ����档
>
> --

> 4��: `python-cn`:CPyUG ~ �����û��� | ����:python-
> c...@googlegroups.com <mailto:pyth...@googlegroups.com>
> �˶�: http://tinyurl.com/45a9tb //���163/qq����:http://tinyurl.com
> /4dg6hc
> ����: https://groups.google.com/group/python-cn
> ����: ����б�! �ǻ�����! http://wiki.woodpecker.org.cn/moin/AskForHelp
>
>
>
>
> --
> http://codeplayer.blogspot.com/
>
> --
> 4��: `python-cn`:CPyUG ~ �����û��� | ����:pyth...@googlegroups.com
> �˶�: http://tinyurl.com/45a9tb //���163/qq����:http://tinyurl.com/4dg6hc
> ����: https://groups.google.com/group/python-cn
> ����: ����б�! �ǻ�����! http://wiki.woodpecker.org.cn/moin/AskForHelp


- --
Xin LI <del...@delphij.net> http://www.delphij.net/
FreeBSD - The Power to Serve! Live free or die
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (FreeBSD)

iQEcBAEBAgAGBQJLcLvOAAoJEATO+BI/yjfBU8AH/19DzKQRJUkZSNkl1YDc5Q6/
Th/EtjBL3Tq+jHVFzIYrsism2Y3UUeBA1BOjMrvYPfE9mI3FBE9GZzIiJTE0uQld
0WpKCEZ1uDDPfvuuCn934Cr83OMymTr5akdOi72X02hqvi9ZF40gxfWlB+ntENkp
JPmP81cfwAiuCXw0kH/Iy9wVEfUNYOEDVBp8+bR8U5DZH2f0ua+SCZ5BPoOMgxR7
fV7yOU5C9jpy91HZs52CeBh2eXeCGNXsmaFX8CQRRXxxpuj9VYpzQEhc1oAMazjJ
Xw7TR6po4NK7e3mVcVHb4JXhxG2B+TNVmgTe2uwGUMAtrGIM8PWk986jdYyGudo=
=yR1g
-----END PGP SIGNATURE-----

john

unread,
Feb 8, 2010, 8:40:54 PM2/8/10
to pyth...@googlegroups.com
谢谢大家。

黄毅给的方法:
while 1:
    print raw_input()
这个方法好用。果然是我太弱了,不知道有这种用法。

我的代码(a.py)是:
while 1:
    print sys.stdin.read()
这种方法不好用。

zoom说的是,开始是没有 while 1 ,后来经过黄毅的提醒,加上了。
但是我觉得这样会占用系统资源。(这种想法对么?)
因为服务器不是自己的,是总公司的,所以想尽可能不让总公司知道我在做这个东西,或者说尽量少的给服务器增加负担,虽然不是坏事。

之后大家给出的方法,我会都试一下。




jondynet

unread,
Feb 8, 2010, 8:44:12 PM2/8/10
to pyth...@googlegroups.com
看看这个,python实现的类似 tail -f 功能
http://www.jondy.net/blog/tail-f-in-python/

2010/2/9 Xin LI <del...@delphij.net>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2010/02/08 17:32, 黄毅 wrote:
> 你应该 readline ,read 会一直读到 EOF 才返回的,所以一直阻塞了。

楼上正解,应该是这个问题。


> 2010/2/9 john <john....@gmail.com <mailto:john....@gmail.com>>
>
>     a.py 的内容是:

>     print sys.stdin.read()
>
>     >>>tail -f mail.log | python a.py
>     这里一直没有输出,即使我手工往mail.log的最后添加内容并保存。
>
>     --
>     来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:python-
>     c...@googlegroups.com <mailto:pyth...@googlegroups.com>
>     退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com
>     /4dg6hc
>     详情: https://groups.google.com/group/python-cn
>     严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>
>
>
>
> --
> http://codeplayer.blogspot.com/
>
> --

> 来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com
> 退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com/4dg6hc
> 详情: https://groups.google.com/group/python-cn
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp


- --
Xin LI <del...@delphij.net>    http://www.delphij.net/
FreeBSD - The Power to Serve!          Live free or die
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (FreeBSD)

iQEcBAEBAgAGBQJLcLvOAAoJEATO+BI/yjfBU8AH/19DzKQRJUkZSNkl1YDc5Q6/
Th/EtjBL3Tq+jHVFzIYrsism2Y3UUeBA1BOjMrvYPfE9mI3FBE9GZzIiJTE0uQld
0WpKCEZ1uDDPfvuuCn934Cr83OMymTr5akdOi72X02hqvi9ZF40gxfWlB+ntENkp
JPmP81cfwAiuCXw0kH/Iy9wVEfUNYOEDVBp8+bR8U5DZH2f0ua+SCZ5BPoOMgxR7
fV7yOU5C9jpy91HZs52CeBh2eXeCGNXsmaFX8CQRRXxxpuj9VYpzQEhc1oAMazjJ
Xw7TR6po4NK7e3mVcVHb4JXhxG2B+TNVmgTe2uwGUMAtrGIM8PWk986jdYyGudo=
=yR1g
-----END PGP SIGNATURE-----
--
来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com
退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com/4dg6hc
详情: https://groups.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp



--
怀才就像是怀孕,日子久了才会被发现!
twitter:http://twitter.com/jondynet

john

unread,
Feb 8, 2010, 8:48:14 PM2/8/10
to pyth...@googlegroups.com
哦~~~
是这样,谢谢。

另通过反复调用tail的方法应该是行,但是我这么一想啊,会不会更多的占用系统资源

Zoom.Quiet

unread,
Feb 8, 2010, 9:07:29 PM2/8/10
to pyth...@googlegroups.com
2010/2/9 john <john....@gmail.com>:

> 哦~~~
> 是这样,谢谢。
> 另通过反复调用tail的方法应该是行,但是我这么一想啊,会不会更多的占用系统资源
>
用了才知道,不要自个儿吓自个儿嗒!


--
http://zoomquiet.org 人生苦短? Pythonic!

工作的层次(依靠谱程度从低到高)=有做->做完->做对->做好->帮助他人做好

john

unread,
Feb 8, 2010, 9:34:08 PM2/8/10
to pyth...@googlegroups.com
谢谢大家

PT M.

unread,
Feb 8, 2010, 10:16:50 PM2/8/10
to pyth...@googlegroups.com
不会占用的,因为raw_input()没有读到输入时候整个线程都阻塞了,被操作系统挂起,不会占用资源

2010/2/9 john <john....@gmail.com>

--
来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com
退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com/4dg6hc
详情: https://groups.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp



--
Arch Linuxer, Pythoner, Geek
--> Blog: http://apt-blog.net

shhgs

unread,
Feb 9, 2010, 3:27:19 PM2/9/10
to python-cn`CPyUG`华蟒用户组(中文Py用户组)
不知道居然可以用这个办法。我一直都是用fcntl吧stdin设成nonblock的,然后再用select读。这个还真是方便。


On Feb 8, 8:24 pm, 黄毅 <yi.codepla...@gmail.com> wrote:
> ~> cat temp.py
> while True:
> print raw_input()
> ~> tail -f data.txt | python temp.py &
> [2] 21980
> ~> aaa
> bbb
> ccc
> ddd
> ddd
> eee
>
> ~> echo fff >> data.txt
> ~> fff
>
> 试验了一下,这个方法没有问题,楼主需要具体描述一下遇到什么问题。
>

> 2010/2/9 john <john.ab...@gmail.com>


>
> > 我想实时监控系统日志(比方说mail.log),打算采取将 tail 的结果通过管道传给 a.py 来分析。
> > 如果是 tail mail.log | python a.py 这种方式没有问题。
> > print sys.stdin.read()
>
> > 但如果 tail -f mail.log | python a.py ,采取这种方法的话,这种方法不好用(没有输出)。
> > 请问各位,这种情况下应该怎么做呢?
>
> > 不知道我的问题叙述清楚了没有。
>
> > --
> > 来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com

> > 退订:http://tinyurl.com/45a9tb//针对163/qq邮箱:http://tinyurl.com/4dg6hc

No.0023

unread,
Feb 9, 2010, 8:03:39 PM2/9/10
to pyth...@googlegroups.com
try it:

import tailer
for line in tailer.follow(open('mail.log')):
processing(line)

On Tue, Feb 09, 2010 at 09:31:38AM +0800, amingsc wrote:
> 能在a.py脚本中循环地 tail -xx mail.log 来获取日志更新不?我知道我们这儿有perl脚
> 本是这么来监控日志的


>
> 在 2010年2月9日上午9:14,john <john....@gmail.com>写道:
>
> 我想实时监控系统日志(比方说mail.log),打算采取将 tail 的结果通过管道传给
> a.py 来分析。
> 如果是 tail mail.log | python a.py 这种方式没有问题。
> print sys.stdin.read()
>
> 但如果 tail -f mail.log | python a.py ,采取这种方法的话,这种方法不好用(没
> 有输出)。
> 请问各位,这种情况下应该怎么做呢?
>
>
>

> --
> 来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com

> 退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com/4dg6hc

--
--
Best Regards,
No.23
----
No....@gmail.com
My Chaos: https://n23.appspot.com

Zoom.Quiet

unread,
Feb 9, 2010, 8:08:28 PM2/9/10
to pyth...@googlegroups.com
2010/2/10 No.0023 <no....@gmail.com>:
> try it:
>
> import tailer

咔咔咔!内置的哪!这最靠谱!

--
http://zoomquiet.org 人生苦短? Pythonic!
流程是对先前蠢行的内在反应! ~ Clay Shirky (Process is an embedded reaction to prior
stupidity) http://is.g...

Zoom.Quiet

unread,
Feb 9, 2010, 8:10:15 PM2/9/10
to pyth...@googlegroups.com, zeuux-python, ZPyUG~珠江三角区Py用户组, guangzhou-tech-party
实用!收录!
http://wiki.woodpecker.org.cn/moin/MiscItems/2010-02-10

2010/2/10 Zoom.Quiet <zoom....@gmail.com>:

Zoom.Quiet: Time is unimportant, only life important!

tocer

unread,
Feb 9, 2010, 8:35:27 PM2/9/10
to python-cn`CPyUG`华蟒用户组(中文Py用户组)

On Feb 10, 9:08 am, "Zoom.Quiet" <zoom.qu...@gmail.com> wrote:
> 2010/2/10 No.0023 <no.0...@gmail.com>:


>
> > try it:
>
> > import tailer
>
> 咔咔咔!内置的哪!这最靠谱!
>

刚试了一下,发现不是内置的,是外部模块,网址 http://code.google.com/p/pytailer/

Leo Jay

unread,
Feb 9, 2010, 10:06:06 PM2/9/10
to pyth...@googlegroups.com
2010/2/10 No.0023 <no....@gmail.com>:
> try it:

我盯着这一行想了半天,我记得python里没这语法啊。。。
还打开解释器试了一下,还真没有这语法。。。

--
Best Regards,
Leo Jay

Leo Jay

unread,
Feb 9, 2010, 10:07:29 PM2/9/10
to pyth...@googlegroups.com
2010/2/10 Zoom.Quiet <zoom....@gmail.com>:

> 2010/2/10 No.0023 <no....@gmail.com>:
>> try it:
>>
>> import tailer
>
> 咔咔咔!内置的哪!这最靠谱!
>

这个不是内置的
>>> import tailer
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named tailer
>>>

2.6和3.1里都没有。

Zoom.Quiet

unread,
Feb 9, 2010, 10:12:12 PM2/9/10
to pyth...@googlegroups.com
2010/2/10 Leo Jay <python...@gmail.com>:

> 2010/2/10 Zoom.Quiet <zoom....@gmail.com>:
>> 2010/2/10 No.0023 <no....@gmail.com>:
>>> try it:
>>>
>>> import tailer
>>
>> 咔咔咔!内置的哪!这最靠谱!
武断了..囧!
Python Package Index : tailer 0.2.1
http://pypi.python.org/pypi/tailer/0.2.1

>>
>
> 这个不是内置的
>>>> import tailer
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> ImportError: No module named tailer
>>>>
>
> 2.6和3.1里都没有。
>
> --
> Best Regards,
> Leo Jay
>

> --
> 来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com
> 退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com/4dg6hc
> 详情: https://groups.google.com/group/python-cn
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>

--
http://zoomquiet.org 人生苦短? Pythonic!

过程改进乃是催生可促生靠谱的人的组织! (ProcessEnhancement keeps evolving organizations
which promoting people b...

tiger

unread,
Feb 9, 2010, 11:36:03 PM2/9/10
to pyth...@googlegroups.com
使用generator:

import time
def tail(thefile):
    thefile.seek(0,2)      # Go to the end of the file
    while True:
         line = thefile.readline()
         if not line:
             time.sleep(0.1)    # Sleep briefly
             continue
         yield line




2010/2/10 Zoom.Quiet <zoom....@gmail.com>

No.0023

unread,
Feb 10, 2010, 8:01:03 PM2/10/10
to pyth...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages