2011-09-08 2 views
5

나는 우분투에서 실행되고 MySQL 데이터베이스의 내용을 처리하는 python 스크립트를 가지고 있습니다. 스크립트가 처리되지 않은 exception으로 실행될 때 또는 처리가 완료되면 알려주기를 원합니다.python 스크립트가 오류로 실행되거나 멈출 때 알림을 보내는 방법은 무엇입니까?

이 작업을 수행하는 적절한 방법은 무엇입니까?

나는 this SO-Answer에 나와있는 방법을 사용하여 파이썬 안에서 전자 메일을 보내는 것을 생각했지만, 내 logindata를 하드 코딩해야한다. (나는 스크립트가 공개 서버에서 실행된다. 회사 내에서).

이를 우회하거나 더 적절한 방법으로 사용하도록 제안하는 제안은 무엇입니까?

+0

이 로그인 데이터는 SMTP 서버 또는 MySQL 또는 둘 모두에서 인증됩니까? – arunkumar

+0

SMTP 서버를 사용합니다. 내 Gmail 계정을 사용하고 싶습니다. – Aufwind

답변

1

일반적으로 SMTP를 통해 이메일을 보낼 때 로그인 데이터를 제공 할 필요가 없습니다. 내가 너라면, 내가 연결 한 대답에서 주어진 코드를 시험해보고 회사의 SMTP 서버를 사용해 보아라.

+0

당신은 * 당신이 ... SMTP를 통해 이메일을 보낼 때 로그인 데이터를 제공 할 필요가 없음을 의미하는 것을 설명해주십시오. ... *? – Aufwind

+0

@Aufwind : 내가'abc @ xyz.com'에게 이메일을 보내고'xyz.com'의 SMTP 서버 (MX 레코드에 나열된 SMTP 서버)에 연결한다면, 대부분의 경우 로그인 정보를 입력하지 않아도 이메일을 수락합니다. – 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

당신이 크론 이것을 실행하는 경우, 나는 bash는 파이썬의 외부 스크립트의 반환 값을보고 제안했다. 깨끗한 종료 0 반환하는 동안

$ 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 

크론를 모니터링하려면 당신이 반환을 쓸 수있는 스크립트가 예외를 제기하는 경우 예를 들어, 하나의 반환 값을 얻을 것이다 파일 어딘가에 가치. 그런 다음 monit을 사용하여 파일에 0이 아닌 값 또는 when the timestamp is older than how often your cron is supposed to run이 포함되어 있으면 알려줍니다.

0

해당 컴퓨터에 sendmail이 설치되어 있습니까? 예를 들어 smtp 서버와 직접 통신하는 대신 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 서버에 시스템/서버에 액세스 할 수있는 경우. 그런 다음 모든 사람이 컴퓨터에 액세스 할 수 있는지에 따라 Gmail의 로그인 세부 정보를 더 안전하게 구성 할 수 있습니다. 잠재적으로 다른 서버에서 간단한 VM으로 실행될 수도 있습니다. 사용자 만 액세스 할 수있는 VM입니다. 그런 다음이 서버를 사용하여 python 스크립트에서 메일을 보내십시오.

회사 네트워크에있는 서버에 액세스 할 수없는 경우 인증을 필요로하지 않는 SMTP 서버를 찾을 수 있습니다.

다른 옵션은 전자 메일을 보내고 자격 증명을 사용하기 위해 GMail 사용자를 만드는 것입니다.

0

GMail API를 사용할 수 있습니다. 스크립트 내에서 암호가 필요하지 않습니다. This answer 도움이 될 수 있습니다.

관련 문제