#!/usr/bin/python
import time
from optparse import OptionParser
SLEEP_INTERVAL = 1.0
i=0
def readlines_then_tail(fin):
print "Iterate through lines and then tail for further lines."
i=0
while True:
line = fin.readline()
if line:
i=i+1
print "line = ",i,line
yield line
else:
tail(fin)
def tail(fin):
print "Listen for new lines added to file."
while True:
where = fin.tell()
print "where = ",where
line = fin.readline()
if not line:
print "Going to sleep"
print "zzz.zzz.zzz.zzz"
time.sleep(SLEEP_INTERVAL)
print "Jusi woke up !"
fin.seek(where)
else:
yield line
def main():
p = OptionParser("usage: tail.py file")
(options, args) = p.parse_args()
if len(args) < 1:
p.error("must specify a file to watch")
with open(args[0], 'r') as fin:
for line in readlines_then_tail(fin):
print line.strip()
if __name__ == '__main__':
main()
IyEvdXNyL2Jpbi9weXRob24KaW1wb3J0IHRpbWUKZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCgpTTEVFUF9JTlRFUlZBTCA9IDEuMAppPTAKZGVmIHJlYWRsaW5lc190aGVuX3RhaWwoZmluKToKICAgIHByaW50ICJJdGVyYXRlIHRocm91Z2ggbGluZXMgYW5kIHRoZW4gdGFpbCBmb3IgZnVydGhlciBsaW5lcy4iCiAgICBpPTAKICAgIHdoaWxlIFRydWU6CiAgICAgICAgbGluZSA9IGZpbi5yZWFkbGluZSgpCiAgICAgICAgaWYgbGluZToKCSAgICBpPWkrMQogICAgICAgICAgICBwcmludCAibGluZSA9ICIsaSxsaW5lCiAgICAgICAgICAgIHlpZWxkIGxpbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICB0YWlsKGZpbikKCmRlZiB0YWlsKGZpbik6CiAgICBwcmludCAiTGlzdGVuIGZvciBuZXcgbGluZXMgYWRkZWQgdG8gZmlsZS4iCiAgICB3aGlsZSBUcnVlOgogICAgICAgIHdoZXJlID0gZmluLnRlbGwoKQoJcHJpbnQgIndoZXJlID0gIix3aGVyZQogICAgICAgIGxpbmUgPSBmaW4ucmVhZGxpbmUoKQogICAgICAgIGlmIG5vdCBsaW5lOgoJICAgIHByaW50ICJHb2luZyB0byBzbGVlcCIKCSAgICBwcmludCAienp6Lnp6ei56enouenp6IgogICAgICAgICAgICB0aW1lLnNsZWVwKFNMRUVQX0lOVEVSVkFMKQoJICAgIHByaW50ICJKdXNpIHdva2UgdXAgISIKICAgICAgICAgICAgZmluLnNlZWsod2hlcmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgbGluZQogICAgICAgICAgICAKZGVmIG1haW4oKToKICAgIHAgPSBPcHRpb25QYXJzZXIoInVzYWdlOiB0YWlsLnB5IGZpbGUiKQogICAgKG9wdGlvbnMsIGFyZ3MpID0gcC5wYXJzZV9hcmdzKCkKICAgIGlmIGxlbihhcmdzKSA8IDE6CiAgICAgICAgcC5lcnJvcigibXVzdCBzcGVjaWZ5IGEgZmlsZSB0byB3YXRjaCIpCiAgICB3aXRoIG9wZW4oYXJnc1swXSwgJ3InKSBhcyBmaW46CiAgICAgICAgZm9yIGxpbmUgaW4gcmVhZGxpbmVzX3RoZW5fdGFpbChmaW4pOgogICAgICAgICAgICBwcmludCBsaW5lLnN0cmlwKCkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkK