انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: log off  (دفعات بازدید: 3530 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین hosseinyounesi

  • Newbie
  • *
  • ارسال: 13
log off
« : 25 تیر 1387، 08:59 ب‌ظ »
سلام تو پایتون چه جوری میشه عملیات log off & in کاربرها رو فهمید ؟ من یه برنامه دارم که با کاربر root در حال اجراست، من هر موقع کسی رو سیستم log in ^ off بکنه من باید بفهمم. ممنون از پاسختون

آفلاین sahama

  • Hero Member
  • *
  • ارسال: 784
  • جنسیت : پسر
  • الهی به امید تو!
پاسخ به: log off
« پاسخ #1 : 27 تیر 1387، 02:27 ق‌ظ »
یه چیزی می گم نخندید:
می تونی به صورت مرتب چک کنی که چه کاربرایی لاگین هستند و با مقایسه ی گذشته نزدیک این رو بفهمی
یا علی

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1543
  • جنسیت : پسر
پاسخ به: log off
« پاسخ #2 : 27 تیر 1387، 08:17 ق‌ظ »
log in و log off متنی منظورتون هست (یعنی مثلا توی bash) یا اینکه گرافیکی (توی گنوم یا kde) ؟
اون برنامتون کارش فقط همینه (که مثلا موقع login یا logoff یه کاربر مثلا یه چیزی چاپ کنه) یا اینکه کار دیگه‌ای هم میخواد انجام بده؟

آفلاین hosseinyounesi

  • Newbie
  • *
  • ارسال: 13
پاسخ به: log off
« پاسخ #3 : 01 امرداد 1387، 10:20 ق‌ظ »
سلام، خیلی ممنون که جواب دادین  ;). راه اول به نظر خودمم رسید ولی اصلا راه خوبی نیست. نه log in/off گرافیکی (مثلا KDE). مگه فرقی هم داره ؟ در ضمن برنامه بر اساس log in/off باید یه سری کارا بکنه.

آفلاین hosseinyounesi

  • Newbie
  • *
  • ارسال: 13
پاسخ به: log off
« پاسخ #4 : 04 امرداد 1387، 11:55 ق‌ظ »
خبری نیست ؟

آفلاین hosseinyounesi

  • Newbie
  • *
  • ارسال: 13
پاسخ به: log off
« پاسخ #5 : 10 امرداد 1387، 05:47 ب‌ظ »
سلام یعنی راهی نداره ؟!!! :o
این موضوع ربطی به زبان نداره. کلا چه جوری میشه فهمید ؟ API  Service Porti ؟

آفلاین مهدی پیشگوی

  • High Hero Member
  • *
  • ارسال: 3100
  • جنسیت : پسر
  • لينوكس يعني آزادي ، امنيت
پاسخ به: log off
« پاسخ #6 : 10 امرداد 1387، 07:14 ب‌ظ »
دستور who رو امتحان کنید

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1543
  • جنسیت : پسر
پاسخ به: log off
« پاسخ #7 : 10 امرداد 1387، 09:01 ب‌ظ »
دستور ps -lA | grep gnome هم ممکنه به دردتون بخوره. UID کاربرانی که در حال استفاده از گنوم هستن رو نشون میده. منتها دائم باید چک کنید که چه کاربرانی هستن. اینطور نیست که هر کاربری که وارد گنوم شد، بتونید بفهمید.
اگه میخواید که هر کاربری که وارد گنوم یا kde شد، مثلا یه تابع خاص اجرا بشه (بدون اینکه توی یک حلقه کاربران حاضر رو چک کنید) کار خیلی سخت میشه. باید به سرویسهای startup اون محیط گرافیکی(یا x window) یه اسکریپت رو اضافه کنید که بتونه با این برنامهٔ پایتون در حال اجرا ارتباط برقرار کنه، مثلا از طریق یک پروسهٔ واسط، یا مثلا از طریق یک بافر یا فایل مجازی یا فایل واقعی... نمی‌دونم خلاصه خیلی خفن میشه. شاید ماژول thread پایتون هم به دردتون بخوره.
ولی راحت‌ترین اینه که یه تابع بنویسید که لیست کاربران (که توی گنوم یا kde هستن) رو برگردونه(return کنه) بعد اون تابع رو توی یه حلقه، دائم فراخوانی کنید و کاربران جدید رو تشخیص بدید. بهتره توی اون حلقه یه مدت کمی هم توقف کنه(با time.sleep) که مثلا هر 0.1 ثانیه کاربران رو چک کنه، تا خیلی cpu رو اشغال نکنه.

آفلاین hosseinyounesi

  • Newbie
  • *
  • ارسال: 13
پاسخ به: log off
« پاسخ #8 : 10 امرداد 1387، 09:33 ب‌ظ »
ممنون. ilius میشه در مورد راه سخته بیشتر توضیح بدین  \\:D/ خیلی مهمه  ](*,)

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1543
  • جنسیت : پسر
پاسخ به: log off
« پاسخ #9 : 10 امرداد 1387، 10:46 ب‌ظ »
فعلاً این راه آسونترش:
#!/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 ثانیه.

آفلاین hosseinyounesi

  • Newbie
  • *
  • ارسال: 13
پاسخ به: log off
« پاسخ #10 : 11 امرداد 1387، 05:53 ب‌ظ »
سلام ممنون. ولی راه دوم ؟  ](*,)

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1543
  • جنسیت : پسر
پاسخ به: log off
« پاسخ #11 : 11 امرداد 1387، 08:34 ب‌ظ »
سلام ممنون. ولی راه دوم ؟  ](*,)
گفتم که دقیق نمیدونم. خودتون می‌تونید برید دنبالش. ولی مگه همین راه چه اشکالی داره؟! می‌بینید که پردازش خیلی کمی می‌گیره.

آفلاین ابراهیم

  • High Hero Member
  • *
  • ارسال: 1295
  • جنسیت : پسر
  • راه‌رو گر صد هنر دارد توکل بایدش
    • سلام!
پاسخ به: log off
« پاسخ #12 : 15 امرداد 1387، 10:05 ب‌ظ »
به نظرم استفاده از who (که آقا مهدی گفت) به جای ps | grep ساده‌تر و اصولی‌تر هست.
ما زنده به آنیم که آرام نگیریم     ...     موجیم که آسودگی ما عدم ماست

آفلاین ابراهیم

  • High Hero Member
  • *
  • ارسال: 1295
  • جنسیت : پسر
  • راه‌رو گر صد هنر دارد توکل بایدش
    • سلام!
پاسخ به: log off
« پاسخ #13 : 16 امرداد 1387، 01:51 ب‌ظ »
راستی شاید دستور lastlog هم به کارت بیاد ;)
ما زنده به آنیم که آرام نگیریم     ...     موجیم که آسودگی ما عدم ماست