私はsys.stdin.readを介してユーザーのアップロードを受け入れるpython CGIスクリプトを持っています。 ファイルを受信した後(正常または不成功)、スクリプトは何らかのクリーンアップを行う必要があります。アップロードが正常に終了した場合はうまく動作しますが、ユーザーがクライアントを閉じると、サーバー上でcgiスクリプトが強制終了され、結果としてクリーンアップコードが実行されません。どのようにスクリプトを常に終了させることができますか。Python cgiスクリプトを正常に終了させる
答えて
シグナルモジュールを使用して終了信号をトラップできます。 mod_pythonでこれを試してみませんか?ドキュメントの
http://docs.python.org/library/signal.html
注信号はI/O操作中に到着したとき
、I/O動作がシグナルハンドラ復帰後に例外を発生させることが可能です。これは、中断されたシステムコールに関する基礎となるUnixシステムのセマンティクスに依存します。
ハンドラからsys.exitを実行しない場合は、破損したパイプおよび/またはファイル書き込みのI/O例外をキャッチする必要があります。
スクリプトはサイレントモードではおそらく殺されません。 Pythonがスローする例外は表示されません。スクリプト全体をtry-except
にラップし、ログファイルに例外を書き込むことをお勧めします。
このようにして、実際に何が起こるかを確認できます。 logging
モジュールはあなたの友人です。
クライアントが終了し、最終的にソケットがタイムアウトすると、ある種のI/Oエラーが発生するはずです。 –
atexitモジュールを使用することができます。ドキュメントから
http://docs.python.org/library/atexit.html
:
のatexitモジュールは、クリーンアップ関数を登録するための単一の関数を定義します。このように登録された関数は、通常のインタプリタ終了時に自動的に実行されます。
注:このモジュールを介して登録された関数は、プログラムがシグナルによって殺されたとき、Pythonの致命的な内部エラーが検出されたとき、またはos._exit()が呼び出されたときは呼び出されません。
これは、sys.exitfunc変数によって提供される機能への代替インタフェースです。
- 1. スクリプトを終了せずにPython cmdサブインタープリタを終了する
- 2. スクリプト出力の終了 - CGI/HTML
- 3. 正常終了
- 4. AndroidでJavaでプロセスを正常に終了させる
- 5. Java - 正常にスレッドを終了する
- 6. 正常にアプリケーションを終了する
- 7. Pythonマルチプロセッシング:終了時にワーカーを終了させる
- 8. kubernetesポッドの正常終了
- 9. 正常に終了するソケットスレッド
- 10. 正常に終了するJBossアプリケーション
- 11. Powershellで正常に終了する
- 12. プロセスが終了する前にCGIプリントが終了します
- 13. ゲームが正常に終了しない
- 14. CSRF - 正常にセッションを正常に終了しない
- 15. Pythonでスクリプトを終了すると、サブプロセスが終了する
- 16. pthreadsでメインスレッドを正常に終了
- 17. 竜巻のストリーミングリクエストを正常に終了
- 18. EOFで正常終了する
- 19. 親スクリプトを終了せずにCtrl-Cでプログラムを終了
- 20. スクリプトを終了することなくプロセスをPythonで終了するには?
- 21. 最後に終了せずにpythonスクリプトを実行
- 22. スクリプトヘッダーの早すぎる終了:CGI + C++
- 23. 応答のないプログラムで、終了を要求されたとき正常に終了しません。
- 24. エラー:python-cgiでhtmlフォームを送信中にヘッダーの前にスクリプト出力が終了する
- 25. SQL ORA-00933コマンドが正常に終了していません
- 26. 「SQLコマンドが正常に終了しません」エラー
- 27. 終了時にClojureのcore.async goループを正常に終了します
- 28. Pythonスクリプトが正しく終了しない
- 29. gdb-pythonでpythonスクリプトを終了するには?
- 30. Python CGIスクリプトが実行されない
OPがスクリプトをCGIスクリプトとして実行している場合、mod_pythonはここには含まれません。 –