2013-08-21 1 views
0

저는 파이썬 스크립트를 가지고 있습니다. 스크립트는 몇 가지 작업을 수행하고 클래스의 메소드 몇 개를 사용하고, 로거 몇 개에 정보를 기록하고 SQS와 작동합니다 Amazon 대기열. 이런 식으로 뭔가 :파이썬 스크립트를 죽이고 마지막 줄을 실행합니다.

python script.py & 

일 :

A = ClassA() 
B = ClassB() 
C = ClassC() 

while True: 
    # pull messages from SQS 
    messages = sqs.pull_messages() 
    logger.info('Pulled messages from SQS') 
    A.do_something(messages) 
    logger.info('Doing something on class A') 
    # download something from the internet 
    data = B.download_something() 
    logger.info('Downloaded something') 
    C.insert_to_database() 

스크립트는 역 추적, 내 리눅스 박스에이 같은 내 스크립트를 시작하기 때문에 메모리가 부족하거나 스크립트를 종료하지 않고 며칠 동안 잘 작동 나중에 상자로 돌아와서 스크립트가 여전히 실행되고 있지만 로거가 1 일 전까지 데이터를 기록했다는 것을 알 수 있습니다. 일반적인 패턴이 아니며, 때로는 스크립트가 몇 시간 후에 작동을 멈추고 때로는 중지되지만 결코 죽지는 않습니다.

내 질문은, 내가 과정을 죽일 때 전화하는 방법이 있습니까? kill pid 무슨 일이 일어 났는지 보시나요? 사후 사후 디버거를 시작하면 스크립트가 수행중인 작업이 나에게 표시되거나 해당 작업을 죽이기 전에 어떤 선이 표시됩니까? 이것을 취할 수있는 방법이 있습니까?

+0

어쩌면 몇 가지 예외를 제기와 함께 사용할 수 있습니까? – gen

+0

@gen, 나는 그렇게하지만, 내가 말했듯이, 스크립트는 실행을 멈추지 않고 나는 그것을 죽여야 만합니다. – PepperoniPizza

답변

3

strace는 시스템 호출과 응답을 보여줍니다. 그것은 당신이 좋아하는 것보다 더 낮은 레벨 일지 모르지만, 네트워크 호출이 실패했는지, 읽은 시간이 초과되었는지 또는 어떤 일이 있었는지 알 수 있습니다. 표준 아마존 리눅스 이미지의 strace에

은 '냠 설치 strace를'

프로그램을 찾으려면 "mycommand"

# find the pid 
ps -ef | grep [m]ycommand 
# use the pid from the previous command 
strace -p $thepid 
+0

감사합니다. – PepperoniPizza

+0

그게 사실 유용하고, 스크립트가 실행 중이거나 어떤 종류의 입력을 기다리는 중 멈춘다는 것을 보여줍니다. 유일한 문제는 낮은 수준이라고 말했듯이 다른 접근 방법이 있습니까? – PepperoniPizza

+0

* 약간 높은 수준의 도구가 있습니다. ltrace는 적어도 시스템 호출에서 C 라이브러리로 이동합니다. 약간 다른 접근법은 gdb를 사용하여 프로세스에 연결하는 것이지만, gdb를 모른다면이 방법을 배우는 가장 좋은 방법은 아닐 것입니다 ... –

1

가장 쉬운 방법은 파일에 표준 오류 리디렉션 하는 것

python script.py 2> my_error_file & 
파이썬은 을 실행 한 프로그램이 실패 할 경우, 당신은 파일

를 확인하실 수 있습니다 라인되는 정보를 제공 할 것입니다

당신은 kill -SIGINT <pid>으로 그것을 죽여야 만합니다.

+0

고마워요,하지만 제가 말했듯이, 프로그램은 실패하지 않습니다. 어딘가에 막혔습니다. 프로세스는 수동으로 중지되어야합니다. – PepperoniPizza

+0

당신이 프로세스를 죽이면 문제가되지 않습니다. 파이썬은 예외를 던져 stacktrace를 stderr –

+0

에 내 손에 작은 실수로 인쇄합니다. –

관련 문제