2011-09-08 14 views
5

Ubuntu'da çalışan ve bir MySQL Veri Tabanı'nın içeriğini işleyen bir python betiğim var. Komut dosyası işlenmemiş bir exception'a veya işlem tamamlandığında işlediğinde bilgilendirilmek istiyorum.Bir python komut dosyası bir hataya dönüştüğünde veya yalnızca durduğunda nasıl bildirim gönderilir?

Bunun gerçekleşmesi için uygun yol nedir?

ben this SO-Answer gösterilen yöntem kullanılarak piton içinden kendime e-posta göndererek düşündüm, ama benim logindata kodlamalısınız bunu yapabilmek için - Ben rahat değilim (script bir kamu sunucusu üzerinde çalışır şirket içinde).

Bunu atlamak veya daha uygun bir şekilde kullanılmasını sağlamak için herhangi bir öneriniz var mı?

+0

Bu giriş verileri SMTP sunucunuz veya MySQL'inizle kimlik doğrulaması mı yoksa her ikisi için mi? SMTP Sever ile – arunkumar

+0

. GMail hesabımı bunun için kullanmak istiyorum. – Aufwind

cevap

1

Genellikle SMTP üzerinden bir e-posta gönderirken giriş verisi sağlamanız gerekmez. Ben senin yerinde olsaydım, bağlandığınız cevapta verilen kodu dener ve şirketinizin SMTP sunucusu ile denerdim.

+0

Lütfen ne demek istediğini açıklayabilir misiniz? * SMTP üzerinden bir e-posta gönderirken giriş verisi sağlamanız gerekmez. ... *? – Aufwind

+0

@Aufwind: Diyorum ki, "abc @ xyz.com" adresine bir e-posta gönderiyorsanız ve xyz.com'un SMTP sunucusuna (yani MX kaydında listelenen) bağlandığınızda, Çoğu durumda, herhangi bir giriş detayı vermeden e-postanızı kabul eder. – NPE

1

Burada, komut dosyası öldüğünde bu özel durumu e-postayla yazdığım ve kullandığım bir özel durum işleyicisi var. sys.excepthook = ExceptHook ile ayarlayın:

import os 
import sys 
import traceback 
import re 
import smtplib 
import getpass 

def ExceptHook(etype, value, tb): 
    """Formats traceback and exception data and emails the error to me: &^&^@&^&^&.com. 

    Arguments: 
    etype -- Exception class type 
    value -- Exception string value 
    tb -- Traceback string data 
    """ 

    excType = re.sub('(<(type|class \')|\'exceptions.|\'>|__main__.)', '', str(etype)).strip() 
    Email = {'TO':"*****@*****.com", 'FROM':getpass.getuser() + '@blizzard.com', 'SUBJECT':'** Exception **', 'BODY':'%s: %s\n\n' % (excType, etype.__doc__)} 

    for line in traceback.extract_tb(tb): 
     Email['BODY'] += '\tFile: "%s"\n\t\t%s %s: %s\n' % (line[0], line[2], line[1], line[3]) 
    while 1: 
     if not tb.tb_next: break 
     tb = tb.tb_next 
    stack = [] 
    f = tb.tb_frame 
    while f: 
     stack.append(f) 
     f = f.f_back 
    stack.reverse() 
    Email['BODY'] += '\nLocals by frame, innermost last:' 
    for frame in stack: 
     Email['BODY'] += '\nFrame %s in %s at line %s' % (frame.f_code.co_name, frame.f_code.co_filename, frame.f_lineno) 
     for key, val in frame.f_locals.items(): 
      Email['BODY'] += '\n\t%20s = ' % key 
      try: 
       Email['BODY'] += str(val) 
      except: 
       Email['BODY'] += '<ERROR WHILE PRINTING VALUE>' 
    thisHost = socket.gethostname() 
    thisIP = socket.gethostbyname(thisHost) 
    gmTime = time.gmtime() 
    logName = 'SomeTool_v%s_%s_%s_%s.%s.%s_%s.%s.%s.log' % (__version__, thisHost, thisIP, gmTime.tm_mon, gmTime.tm_mday, gmTime.tm_year, gmTime.tm_hour, gmTime.tm_min, gmTime.tm_sec) 
    if not os.path.exists(LOGS_DIR): 
     try: 
      os.mkdir(LOGS_DIR) 
     except: 
      baseLogDir = os.path.join(NET_DIR, "logs") 
      if not os.path.exists(baseLogDir): 
       try: 
        os.mkdir(baseLogDir) 
       except: 
        pass 
       else: 
        open(os.path.join(baseLogDir, logName), 'w').write(Email['BODY']) 
     else: 
      open(os.path.join(LOGS_DIR, logName), 'w').write(Email['BODY']) 
    Email['ALL'] = 'From: %s\nTo: %s\nSubject: %s\n\n%s' % (Email['FROM'], Email['TO'], Email['SUBJECT'], Email['BODY']) 
    server = smtplib.SMTP(MY_SMTP) 
    server.sendmail(Email['FROM'], Email['TO'], Email['ALL']) 
    server.quit() 

if __name__ == '__main__': 
    sys.excepthook = ExceptHook 
    try: 
     1/0 
    except: 
     sys.exit() 
0

Eğer cron ile bu çalıştırıyorsanız, ben bash piton dışında senaryonun dönüş değeri bakarak önermek istiyorum. Temiz bir çıkış 0 döndürür iken

$ python test.py 
Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    raise ValueError("test") 
ValueError: test 
$ echo $? 
1 

:

$ python test.py 
$ echo $? 
0 

cron'u izlemek için sen getiriyi yazabilir, script bir özel durum Örneğin, 1 olarak bir geri dönüş değerini alacak bir yere bir dosyaya değer. Daha sonra, dosya 0 veya when the timestamp is older than how often your cron is supposed to run dışında bir değer içeriyorsa sizi bilgilendirmek için monit kullanın.

0

Bu makinenin sendmail'i yüklü mü, sadece smtp sunucusundan konuşmak yerine e-posta göndermek için sendmail kullanıyorum örn. Bu

echo -e "To: [email protected]\nSubject: Testx\nTest\n" | sudo sendmail -bm -t -v 

O ayrıntılı modda eylem sendmail'i gösterecektir denemek ve eğer çalışırsa sadece e-posta örneğin göndermek için sendmail kullanabilirsiniz senin seçeneklerin

ps = Popen(["/usr/lib/sendmail"]+list(your_recipents), \ 
       stdin=PIPE) 
    ps.stdin.write('you msg') 
    ps.stdin.flush() 
    ps.stdin.close() 
0

bazıları -

şirket ağına, yapabileceğiniz kurulum posta geçişi olarak basit SMTP sunucusu üzerinde bir makine/sunucuya erişimi varsa. Daha sonra, GMail için giriş bilgilerinizi, makineye kimlerin erişebileceğine bağlı olarak, orada biraz daha güvenli bir şekilde yapılandırabilirsiniz. Potansiyel olarak başka bir sunucuda basit bir VM olarak çalıştırılabilir. Sadece erişiminiz olan bir VM. Sonra bu sunucuyu python komut dosyasından posta göndermek için kullanın.

Şirket ağındaki bir sunucuya erişiminiz yoksa, kimlik doğrulama gerektirmeyen SMTP sunucularını arayabilirsiniz. Veya başka bir seçenek, yalnızca e-posta göndermek ve kimlik bilgilerini kullanmak için bir GMail kullanıcısı oluşturmaktır.

0

GMail API'sini kullanabilirsiniz. Komut dosyasında şifreniz gerekmez. This answer yardımcı olabilir.

İlgili konular