2013-05-24 4 views
-1

내 파이썬 스크립트가 오류 메시지없이 종료되면 이상한 동작이 발생합니다. 내 디버깅을 기반으로 서버에 파일을 scp로 popen() 호출 주위에 일어나고있다. 나는 그것을 향상된 디버깅하기위한 시도에서파이썬 잡기 Popen 출력

logMessage(LEVEL_INFO, "copyto is " + copyto) 
pid = Popen(["scp", "-i", "/root/.ssh/id_rsa", "/usr/gpsw/gpslog" + self.node_addr, copyto], stdout=PIPE) 
__s = pid.communicate()[0] 
logMessage(LEVEL_INFO, "GPS log SCP complete") 

: 여기

logMessage(LEVEL_INFO, "copyto is " + copyto) 
pid = Popen(["scp", "-i", "/root/.ssh/id_rsa", "/usr/gpsw/gpslog" + self.node_addr, copyto], stdout=PIPE, stderr=PIPE) 
out, err = pid.communicate() 
if out: 
    print "[" + self.node_addr + "] stdout of pid: " + str(out) 
if err: 
    print "[" + self.node_addr + "] stdout of pid: " + str(err) 
print "[" + self.node_addr + "] returncode of pid: " + str(pid.returncode) 
logMessage(LEVEL_INFO, "GPS log SCP complete") 

내 콘솔 출력된다 (패턴

코드는 (내가 원래 저자 아니었다)이었다 해야 5dda77, 5dd9fa, 5dda0d 반복. 이것은

[5dda77] returncode of pid: 0 
[5dd9fa] returncode of pid: 0 
[5dda0d] returncode of pid: 0 
[5dda77] returncode of pid: 0 
[5dd9fa] returncode of pid: 0 
[5dda0d] returncode of pid: 0 
# (the script exited and I'm back at the prompt) 

) 실제 사건을 기반으로 로그 출력은 다음과 같습니다.

INFO copyto is [email protected]:/usr/scu/datafiles/gpslog5dda77 
INFO GPS log SCP complete 
INFO copyto is [email protected]:/usr/scu/datafiles/gpslog5dd9fa 
INFO GPS log SCP complete 
INFO copyto is [email protected]:/usr/scu/datafiles/gpslog5dda0d 
INFO GPS log SCP complete 
INFO copyto is [email protected]:/usr/scu/datafiles/gpslog5dda77 
INFO GPS log SCP complete 
INFO copyto is [email protected]:/usr/scu/datafiles/gpslog5dd9fa 
INFO GPS log SCP complete 
INFO copyto is [email protected]:/usr/scu/datafiles/gpslog5dda0d 
INFO GPS log SCP complete 
INFO copyto is [email protected]:/usr/scu/datafiles/gpslog5dda77 

로그 및 출력 데이터를 기반으로합니다. 나는 "GPS log SCP complete"를 기록하기 전에 Python 스크립트가 충돌하기 때문에 SCP 중에 뭔가 잘못되었다고 생각합니다. 흥미로운 점은 파일이 완전히 복사되었다는 것을 서버 측에서 볼 수 있다는 것입니다. 그래서 두 가지 질문 :

  1. 나는 popen을 잘못 사용하고 있습니까?
  2. stderr에서 오류 메시지가 표시되지 않는 이유는 무엇입니까?

감사

편집 : 이 스크립트 결코 출구해야한다. 프로세스의 "정상 종료"는 없습니다. 사용 가능한 GPS 노드에서 데이터를 검색하기 위해 서버의 요청을 무기한으로 실행해야합니다.

주요 루프의 코드는 다음과 같습니다 당신은 잘 Popen를 사용하는

stop_flags = 0 

... (API for server and GPS nodes to interact with) 

def main(): 

    ... (System initialization) 

    while stop_flags == 0: 
     # listen for messages 
     xmlrpcserver.handle_request() 
     comm.poll() 
    if stop_flags == STOP_FLAG_RESTART: 
     # suppress Pylint warning for reimport of Popen,PIPE 
     # pylint: disable-msg=W0404 
     from subprocess import Popen, PIPE 
     # use this instead of call to suppress output 
     pid = Popen(["/etc/init.d/S999snap", 
        "restart"], 
        stdout=PIPE) 
     __s = pid.communicate()[0] 
    if stop_flags == STOP_FLAG_REBOOT: 
     # suppress Pylint warning for reimport of Popen,PIPE 
     # pylint: disable-msg=W0404 
     from subprocess import Popen, PIPE 
     # use this instead of call to suppress output 
     pid = Popen(["reboot"], 
        stdout=PIPE) 
     __s = pid.communicate()[0] 

if __name__ == '__main__': 
    main() 
+0

캡쳐 할 표준 오류가 있습니까?bash에서 실패한 명령을 수동으로 실행 해 보았습니까? 아니면 무언가가 있어야한다고 가정하고 있습니까? – abarnert

+0

그 사이에, 당신은 그것이 "충돌"한다고 생각하게합니까? 세그 폴트가 있습니까? 아니면 예외 추적? 대부분의 경우, 정상적으로 종료되고'logMessage'가 마지막 메시지를 표시하지 않는 유일한 이유는 로그 파일을 닫지 않는 사용자 정의 코드라는 것입니다. – abarnert

+0

파이썬이 충돌하는 것을 어떻게 알 수 있습니까? 오류 메시지가없고 scp가 성공했다고 말하면 왜 그것이 충돌하고 있다고 생각하는지 궁금합니다. – SethMMorton

답변

-1

.

다른 명령으로 동일한 명령을 직접 테스트하지 않으면 (예 : bash을 통해 대화식으로 실행), 아무 것도 없기 때문에 stderr에 아무것도 표시되지 않을 가능성이 큽니다 stderr에 인쇄됩니다.

segfault, 예외 추적 또는 기타 다른 이유로 믿을 수 없다면 거의 확실하게 충돌하지 않습니다. 모든 작업이 성공적으로 완료되었다고 했으므로 추락했다고 생각합니까? 마지막 로그 메시지가 표시되지 관해서는

은 ... 당신은 당신이 명확한 대답을 원하는 경우 우리에게 사용자 정의 logMessage 코드를 표시해야하지만, 나는 당신에게 결코 flush 또는 close 로그 파일을 기꺼이입니다.

마지막으로 관련성이 높은 multithreading 질문에 태그를 추가했습니다. 다시 말하지만, 실제로 쓰레드가 어떻게 쓰이고 있는지에 대한 설명조차 없이는 우리는 아무 것도 할 수 없지만, 예를 들어이 코드를 daemon=True 쓰레드에서 실행하고 메인 쓰레드를 종료 할 수 있습니다 .

+0

이 스크립트는 실제로 충돌합니다. 그것에는 해지가 없습니다. 그것의 디자인은 GPS 노드를 사용할 수있을 때 영원히 처리하는 것입니다. 그리고 종종 이러한 노드 중 하나에서 서버로 데이터를 SCPing 한 후 충돌합니다. 파이썬 스크립트가 종료되고 오류가 기록되거나 표시되지 않습니다. 그러나 SCP 명령 다음의 코드에서이 정확한 지점에서 항상 발생하며 SCP PID에서 리턴 코드를 얻지 못합니다. – linsek

+0

먼저 "정상 종료"는 충돌하지 않습니다. 둘째로, 절대로 종료해서는 안되는 코드를 보지 않고 종료하게 만드는 원인을 디버깅하기를 어떻게 기대합니까? – abarnert

관련 문제