디버깅 : 콘솔 출력 및 시작 스크립트


16

파이썬 코드에서 역 추적을 찾기 위해 upstart 스크립트의 출력을 터미널에 어떻게 보내나요? 단 1 초만 걸렸던 역 추적없이 일을 할 수있게되었습니다. 오류를 추적하기 위해 여러 파일 쓰기 호출을 배치해야합니다. 역 추적을 통해 이전에 발견 한 것은 몇 분으로 바뀌 었습니다. 이것은 비참하다. 이것은 지금 몇 주 동안 진행되어 왔고 나는 아프다. 어떤 사람들은 이것에 대해 이야기 할 것입니다. 디버거없이 어셈블리를 다시 사용하고있는 것 같습니다.

답변:


27

Upstart 1.4 이상을 사용하는 경우 console logUpstart 작업을 시작하면 stdout / stderr에 대한 모든 출력이로 종료됩니다 /var/log/upstart/<job>.log. 그런 다음 tail -f /var/log/upstart/<job>.log &터미널에 출력이 나타나도록 할 수 있습니다 .


파티에 늦었지만이 답변은 저를 구했습니다 :) 또한 upstart conf 파일에 특별한 설정이 없으면 이것이 저에게 효과적입니다. 내 입장에서는 이것이 허용되는 답변이어야합니다.
rslite

시작 관리 서비스 로그가에 있음을 몰랐습니다 /var/log/upstart. 정말 유용합니다. 감사합니다.
Francisco

2

Upstart Cookbook 에는 디버깅 기술에 대한 전체 섹션이 있습니다 . 가장 쉬운 방법은 --debug커널 인수에 추가 하는 것입니다. 그러면 시동의 세부 정보가 증가하고 모든 것이 syslog에 덤프됩니다. 예, 디버깅은 복잡합니다. 병렬화 된 init 시스템을 만드는 데 필요한 순 복잡성을 반영합니다. 개선의 여지가 있다고 확신합니다.


2
쿡 북은 새로운 커머에게 디버깅 환경을 올바르게 설명하지 않습니다. 전에도 비슷한 설명을 보았습니다. 부족하거나 전문가 가정이 있습니다. 커뮤니티에 추가하고 시작하려는 사람들에게는 매우 실망 스럽습니다. 나는 어셈블리를 제외하고 오류가 발생하는 코드 라인을 제공하지 않는 프로그래밍 환경을 결코 본 적이 없다.
bambuntu

그렇다면 무엇을 제안 하시겠습니까? 열린 문서입니다. 거기에 제시된 것 이상의 도약과 한계를 가진 디버깅 기술이 있다면 그것을 추가하십시오. OP의 문제는 추가 선택 런타임 내에서 기본 유닉스 패러다임을 관리하는 방법과 배치되는 컨텍스트를 이해하지 못했기 때문에 발생합니다. 파이썬을 사용하거나 [여기에 멋진 런타임 언어 삽입]이 의미하는 것은 아닙니다. 기본 런타임 인 ​​UNIX를 무시하십시오.
ppetraki

2

파이썬 데몬을 쓸 때 모든 예외를 포착하고 로그 파일에 던집니다. 나는 디버그뿐만 아니라 프로덕션에서도 사용합니다. 나는 매일 아침 실행되는 작은 스크립트가있어 로그에서 무언가를 화나게합니다.

물론 데몬을 계속 실행하는 데 도움이됩니다.

일부 샘플 코드 (흥미롭지 않은 부분은 제거) :

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename=LOG_FILE,
                    filemode='w')
    logging.info("Sincrod inicializado")
    if not DEBUG:
        daemonize()
    while True:
        try:
            actua()
        except:
            logging.error(sys.exc_info())
        if (datetime.datetime.now().hour > NOITE_EMPEZA\
         and datetime.datetime.now().hour < NOITE_REMATA):
            time.sleep(INTERVALO_NOITE)
        else:
            time.sleep(INTERVALO_DIA)

여기서 actua ()는 실제 데몬입니다 (로그에도 기록합니다). 또한 설정 파일에 DEBUG 변수가 있으며, True 일 때 데몬을 포크하지 않으므로 콘솔에서 실행됩니다.

데몬

데몬은 Windows 서비스와 유닉스에 해당합니다. 다른 프로세스와 독립적으로 백그라운드에서 실행되는 프로세스입니다. 그것은 그들의 아버지가 일반적으로 init이고 그들이 어떤 tty로부터 분리되어 있음을 의미합니다. 독립적이기 때문에 출력을 넣을 사전 정의 된 장소가 없습니다.

데몬을 만드는 데는 파이썬 라이브러리와 스 니펫이 많이 있습니다. 위의 예에서는 Steinar Knutsens와 Jeff Kunces 버전의 아이디어를 결합한 고유 한 기능을 사용합니다. 가능한 한 간단합니다 . 두 번 포크 합니다.

def daemonize():
    """Forks this process creating a daemon and killing the original one"""
    if (not os.fork()):
        # get our own session and fixup std[in,out,err]
        os.setsid()
        sys.stdin.close()
        sys.stdout = NullDevice()
        sys.stderr = NullDevice()
        if (not os.fork()):
            # hang around till adopted by init
            ppid = os.getppid()
            while (ppid != 1):
                time.sleep(0.5)
                ppid = os.getppid()
        else:
            # time for child to die
            os._exit(0)
    else:
        # wait for child to die and then bail
        os.wait()
        sys.exit()

알았어 이미 syslog에 로깅하고 있으므로 데몬 메시지를 필터링하여 콘솔에 덤프하십시오. 이것이 왜 시작에 특정한지 모르겠습니까? SysV init도 같은 문제가 있습니다.
ppetraki

당신은 옳습니다. 시작에 특정 적이 지 않습니다. 대부분의 서버가 시작하지 않고 8.04를 실행한다는 사실을 말하십시오. 그러나 시동에도 유효합니다. OP는 upstart에서만 작동하는 방법이 아니라 upstart로 Python 스크립트를 디버깅하는 방법을 묻고있었습니다. syslog가 아닌 특정 파일에 기록하고 있으며 여기서 '트릭'은 모든 예외를 포착하고 스택 추적을 해당 파일에 덤프합니다.
Javier Rivera

글쎄, 그것은 컨텍스트에 따라 stdout을 관리하는 것입니까? tty에 연결되어 있는지 또는 데몬으로 작동하는지에 관계없이 로깅 세부 정보가 동일한 많은 유닉스 데몬을 알고 있습니다. 이것이 Ruby라면 예외를 출력하는 데 사용하는 기본 클래스 메서드를 재정의하거나 장식합니다. 파이썬에서 비슷한 것을 할 수 있다고 확신합니다. 스택 교환에 대해이 질문을하는 것이 더 좋습니다. 이것은 기본적인 유닉스 데몬 코딩 / 디자인 문제이며, 언급 한 바와 같이 init 스크립트와는 아무런 관련이 없습니다.
ppetraki

나는 아직도 링고에 익숙해지고있다. 나는 데몬으로 가정합니다. 백그라운드에서 실행되는 특정 스크립트를 의미합니다. 귀하의 코드에서 스크립트 스크립트의 콜백을 얻기 위해 actua () 대신 스크립트를 넣었습니까? 어쨌든 파일 대신 콘솔로 채널을 보내야합니까?
bambuntu

1
독립형 의미의 데몬은 일반적으로 시작된 tty에서 분리되고 원래 파일 핸들을 stdin, stdout 및 stdin으로 닫았으며 init의 자식입니다. 따라서 특정 장소에 예외를 인쇄하려면 예외를 출력하는 방법을 찾아 거기서 지시하십시오. linfo.org/daemon.html . 다시 말하지만, 이것은 시작과 관련이 없으며 심지어 그 문제에 대한 초기화와도 관련이 없습니다. 실제 데몬 모드에서 프로그램이 올바르게 작동하도록 한 다음 시작하십시오.
ppetraki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.