내 파이썬 스크립트가 오류 메시지없이 종료되면 이상한 동작이 발생합니다. 내 디버깅을 기반으로 서버에 파일을 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 중에 뭔가 잘못되었다고 생각합니다. 흥미로운 점은 파일이 완전히 복사되었다는 것을 서버 측에서 볼 수 있다는 것입니다. 그래서 두 가지 질문 :
- 나는 popen을 잘못 사용하고 있습니까?
- 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()
캡쳐 할 표준 오류가 있습니까?bash에서 실패한 명령을 수동으로 실행 해 보았습니까? 아니면 무언가가 있어야한다고 가정하고 있습니까? – abarnert
그 사이에, 당신은 그것이 "충돌"한다고 생각하게합니까? 세그 폴트가 있습니까? 아니면 예외 추적? 대부분의 경우, 정상적으로 종료되고'logMessage'가 마지막 메시지를 표시하지 않는 유일한 이유는 로그 파일을 닫지 않는 사용자 정의 코드라는 것입니다. – abarnert
파이썬이 충돌하는 것을 어떻게 알 수 있습니까? 오류 메시지가없고 scp가 성공했다고 말하면 왜 그것이 충돌하고 있다고 생각하는지 궁금합니다. – SethMMorton