Python スクリプトがエラー メッセージなしで終了すると、奇妙な動作が発生します。私のデバッグに基づいて、ファイルをサーバーに scp するための 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 root@192.168.20.1:/usr/scu/datafiles/gpslog5dda77
INFO GPS log SCP complete
INFO copyto is root@192.168.20.1:/usr/scu/datafiles/gpslog5dd9fa
INFO GPS log SCP complete
INFO copyto is root@192.168.20.1:/usr/scu/datafiles/gpslog5dda0d
INFO GPS log SCP complete
INFO copyto is root@192.168.20.1:/usr/scu/datafiles/gpslog5dda77
INFO GPS log SCP complete
INFO copyto is root@192.168.20.1:/usr/scu/datafiles/gpslog5dd9fa
INFO GPS log SCP complete
INFO copyto is root@192.168.20.1:/usr/scu/datafiles/gpslog5dda0d
INFO GPS log SCP complete
INFO copyto is root@192.168.20.1:/usr/scu/datafiles/gpslog5dda77
したがって、ログと出力データに基づいています。「GPS log SCP complete」をログに記録する前に Python スクリプトがクラッシュするため、SCP 中に何か問題が発生していると思われます。興味深いのは、サーバー側でファイルが完全にコピーされたことです。2つの質問:
- popen を間違って使用していますか?
- stderr にエラー メッセージが表示されないのはなぜですか?
ありがとう
編集: このスクリプトは決して終了しないでください。プロセスの「通常の終了」はありません。利用可能な GPS ノードからデータを取得するために、サーバーからのサービス要求を無期限に実行する必要があります。
主なループ コードは次のとおりです。
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()