Alan Gauld wrote:

"David" <[email protected]> wrote


I was playing around with trying to create a python program like tail -f as discussed on the list. i came up with this;

Alan, thanks for your time and great tips :)

import os

def get_tail(fname, bufsize, linesep):
        f = open(fname, 'rb')
        f.seek(0, 2)
        pos, tailsize = divmod(f.tell(), bufsize)
        if tailsize == 0:
            pos = max(0, pos-1)
        pos *= bufsize
        f.seek(pos)
        lines = f.read().split(linesep)
        f.close()
        return lines[-2:]


def tail_it(fname, bufsize=8192, linesep=os.linesep):
    while True:
        new_time = os.stat(tail_fname).st_mtime
        if new_time > old_time:
            time.sleep(sec_to_wait)
            print get_tail (fname, bufsize, linesep)
        old_time = new_time

I haven't tried it but that should be close to what you want.


This helps a lot because I can now see how the loop works. One of my problems is putting the pieces of code in the right places. It helps me understand when I can run the program and see the errors and output to make adjustments.

OTOH since you only use the last two lines why not miss all
that out and go straight to where you want to be with:

f.seek(-buffsize, os.SEEK_END)    # goto one buffsize away from end
return f.read().split(linesep)[-2:]
I like it!

Here is what I came up with;

#!/usr/bin/python

"Python program similar to tail -f"
import os
import sys
import commands
import time

sec_to_wait = 60
fname = raw_input('Enter the log file to be monitored: ')

def usage():
    """Explains the program to the user"""
        print \
"You will need to be root to monitor most log files."

def check_whoami():
    """Check if Root"""
    if commands.getoutput('whoami') != 'root':
        sys.exit('\nYou will need to be Root!\n')

def print_log_end(fname, bufsize, linesep):
    f = open(fname, 'r')
    f.seek(-bufsize, os.SEEK_END)    # goto one buffsize away from end
    log = f.read().split(linesep)[-8:]
    for i in log:
        print i
    f.close()

def tail_it(fname, bufsize, linesep):
    old_time = os.stat(fname).st_mtime
    while True:
        new_time = os.stat(fname).st_mtime
        if new_time > old_time:
            time.sleep(sec_to_wait)
            updated = print_tail(fname, bufsize, linesep)
            for i in updated:
                print i
        old_time = new_time
                                
def print_tail(fname, bufsize, linesep):
    f = open(fname, 'r')
    f.seek(-bufsize, os.SEEK_END)    # goto one buffsize away from end
    return f.read().split(linesep)[-2:]
    f.close()

if __name__ == "__main__":
    print_log_end(fname, bufsize=8192, linesep=os.linesep)
    check_whoami()
    tail_it(fname, bufsize=8192, linesep=os.linesep)

[output]
Enter the log file to be monitored: /var/log/messages
May 6 16:00:01 opteron cron[24679]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly) May 6 16:00:01 opteron run-crons[24685]: (root) CMD (/etc/cron.hourly/moodle) May 6 16:00:01 opteron run-crons[24688]: (root) CMD (/etc/cron.hourly/vnstat)
May  6 16:03:06 opteron su[24712]: Successful su for root by david
May  6 16:03:06 opteron su[24712]: + pts/6 david:root
May 6 16:03:06 opteron su[24712]: pam_unix(su:session): session opened for user root by david(uid=1000) May 6 16:10:01 opteron cron[24751]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )

May 6 16:20:01 opteron cron[24788]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )


--
Powered by Gentoo GNU/Linux
http://linuxcrazy.com
_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to