2011-09-08 6 views
5

मेरे पास एक पाइथन स्क्रिप्ट है जो उबंटू पर चलती है और एक MySQL डेटाबेस की सामग्री को संसाधित करती है। जब मैं स्क्रिप्ट एक अनचाहे exception या जब यह प्रसंस्करण हो जाती है तो मैं सूचित होना चाहता हूं।जब कोई पाइथन स्क्रिप्ट किसी त्रुटि में चलती है या बस रुक जाती है तो खुद को कैसे सूचित करें?

ऐसा करने का उचित तरीका क्या है?

मैं विधि this SO-Answer में दिखाया गया है का उपयोग कर अजगर के भीतर से अपने आप को एक ईमेल भेजने के बारे में सोचा, लेकिन मैं अपने logindata हार्डकोड करने के लिए है कि ऐसा करने में सक्षम होने के लिए - जो मैं के साथ सहज नहीं हूँ (स्क्रिप्ट एक सार्वजनिक सर्वर पर चलाता है कंपनी के भीतर)।

किसी भी सुझाव को बाईपास करने के लिए या इसे अधिक उपयुक्त तरीके से उपयोग करने के लिए कोई सुझाव?

+0

क्या यह लॉगिन डेटा आपके एसएमटीपी सर्वर या MySQL या दोनों के साथ प्रमाणित करने के लिए है? एसएमटीपी-सेवर के साथ – arunkumar

+0

। मैं इसके लिए अपने जीमेल खाते का उपयोग करना चाहता हूं। – Aufwind

उत्तर

1

आपको आमतौर पर SMTP पर ईमेल भेजने पर लॉगिन डेटा की आपूर्ति करने की आवश्यकता नहीं है। अगर मैं आप थे, तो मैंने आपके द्वारा लिंक किए गए उत्तर में दिए गए कोड के साथ प्रयोग किया होगा और इसे अपनी कंपनी के एसएमटीपी सर्वर से आजमाएं।

+0

क्या आप कृपया बता सकते हैं कि आप क्या मतलब है * आप ... SMTP पर ईमेल भेजते समय लॉगिन डेटा की आपूर्ति करने की आवश्यकता नहीं है। ... *? – Aufwind

+0

@Aufwind: मैं बस इतना कह रहा हूं कि यदि आप 'abc @ xyz.com' पर एक ईमेल भेज रहे हैं, और' xyz.com' के एसएमटीपी सर्वर से कनेक्ट करें (यानी एमएक्स रिकॉर्ड पर सूचीबद्ध एक) ज्यादातर मामलों में यह आपको बिना किसी लॉगिन विवरण प्रदान किए आपके ईमेल को स्वीकार करेगा। – NPE

1

यहां लिखा गया एक अपवाद हैंडलर है और स्क्रिप्ट मरने पर उस ईमेल को अपवाद का उपयोग करता है। sys.excepthook = ExceptHook के साथ सेट करें:

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

आप क्रॉन के साथ इस चला रहे हैं, मैं पार्टी में अजगर के बाहर स्क्रिप्ट की वापसी मूल्य पर रखने का सुझाव देते हैं।

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

एक साफ बाहर निकलने देता है जबकि 0: उदाहरण के लिए, अगर स्क्रिप्ट एक अपवाद को जन्म देती है, तो आप 1 की वापसी मूल्य मिल जाएगा

$ python test.py 
$ echo $? 
0 

क्रॉन पर नजर रखने के लिए, आप वापसी लिख सकते हैं कहीं फ़ाइल के लिए मूल्य। फिर, monit का उपयोग करें जब फ़ाइल में 0 के अलावा कोई मान, या when the timestamp is older than how often your cron is supposed to run हो।

0

क्या उस मशीन में sendmail स्थापित है, मैं सिर्फ smmail सर्वर से सीधे बात करने के बजाय ईमेल भेजने के लिए sendmail का उपयोग करता हूं उदा। इस

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

यह वर्बोज़ मोड में कार्रवाई में sendmail दिखाएगा कोशिश करते हैं और अगर यह काम करता है अगर तुम सिर्फ ईमेल भेजने के लिए जैसे sendmail उपयोग कर सकते हैं

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

अपने विकल्पों में से कुछ हैं -

आप कंपनी के नेटवर्क है, जहां आप कर सकते हैं सेटअप एक मेल रिले के रूप में एक साधारण एसएमटीपी सर्वर पर एक मशीन/सर्वर तक पहुंच नहीं है। फिर आप जीमेल के लिए अपने लॉगिन विवरण को और अधिक सुरक्षित रूप से कॉन्फ़िगर कर सकते हैं, इस पर निर्भर करता है कि किसके पास मशीन तक पहुंच है। यह संभावित रूप से किसी अन्य सर्वर पर एक साधारण वीएम के रूप में भी चलाया जा सकता है। एक वीएम जो केवल आपके पास पहुंच है। फिर अपनी पाइथन लिपि से मेल भेजने के लिए इस सर्वर का उपयोग करें।

आप कंपनी के नेटवर्क पर एक सर्वर के लिए पहुँच नहीं है, तो आप SMTP सर्वर जो प्रमाणीकरण की आवश्यकता नहीं है के लिए देखो सकता है।

या दूसरा विकल्प ईमेल भेजने और उसके प्रमाण-पत्रों का उपयोग करने के लिए जीमेल उपयोगकर्ता बनाना है।

0

आप जीमेल एपीआई का उपयोग कर सकते हैं। स्क्रिप्ट के अंदर आपको अपने पासवर्ड की आवश्यकता नहीं है। This answer मदद कर सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे