فعلاً این راه آسونترش:
#!/usr/bin/env python
#File: users_monitore.py
import sys, os, time
def usersList(keys=['gnome', 'kde']):
uids=[]
for key in keys:
procLines = os.popen('ps -lA | grep %s'%key).read().split('\n')
for line in procLines:
parts=line.split(' ')
i = 0
n = len(parts)
while i<n:
if parts[i]=='':
parts.pop(i)
n -= 1
else:
i += 1
if len(parts)>2:
if not parts[2] in uids:
uids.append(parts[2])
return uids
def getTime():
return '%s/%s/%s %s:%s:%s'%time.localtime()[:6]
def logedIn(uid):
print 'user %s loged in, at %s'%(uid, getTime())
## do something here
def logedOut(uid):
print 'user %s loged out, at %s'%(uid, getTime())
## do something here
def compareLists(l1, l2):
if l1==l2:
return ([], [])
added=[]
removed=[]
for m in l1:
if not m in l2:
removed.append(m)
for m in l2:
if not m in l1:
added.append(m)
return (added, removed)
def main():
print 'Listening to users loging in/logging out. Press Ctrl+C to stop.'
users = usersList()
while True:
try:
time.sleep(0.1)
pUsers = users
users = usersList()
if pUsers==users:
continue
(a, r) = compareLists(pUsers, users)
for u in a:
logedIn(u)
for u in r:
logedOut(u)
except KeyboardInterrupt:
break
if __name__=='__main__':
main()
توی یه فایل(مثلاً users_monitore.py) ذخیره کنید، بهش مجوز اجرا بدید بعد Alt+Crtl+F1 بزنید و با حساب root وارد بشید و برنامه رو اجرا کنید. بعد Alt+Crtl+F7 بزنید و از محیط گرافیکی(گنوم یا kde) خارج بشید(logout)، حالا اگه Alt+Crtl+F1 بزنید میبینید که یه پیغامی چاپ کرده که این کاربر خارج شد. همینطور login کاربرها. اگه میخواید login و logout به خط فرمان(bash) رو هم نشون بده، کلمهٔ bash رو به آرگومان تابع usersList (که یه لیست هست) اضافه کنید. توابع logedIn و logedOut رو هم به دلخواه خودتون تغییر بدید تا موقع ورود و خروج کاربرها یه کار خاصی انجام بده(با داشتن UID اون کاربر).
در ضمن با این زمان 0.1 ثانیه برای sleep، خیلی کم cpu رو اشغال میکنه(کمتر از یک درصد)، اگه بازم دیدید میتونید زمانش رو بیشتر کنید(توی خط پنجم تابع main) مثلا 0.2 ثانیه.