2009-05-20 10 views
2

私はsys.stdin.readを介してユーザーのアップロードを受け入れるpython CGIスクリプトを持っています。 ファイルを受信した後(正常または不成功)、スクリプトは何らかのクリーンアップを行う必要があります。アップロードが正常に終了した場合はうまく動作しますが、ユーザーがクライアントを閉じると、サーバー上でcgiスクリプトが強制終了され、結果としてクリーンアップコードが実行されません。どのようにスクリプトを常に終了させることができますか。Python cgiスクリプトを正常に終了させる

答えて

1

シグナルモジュールを使用して終了信号をトラップできます。 mod_pythonでこれを試してみませんか?ドキュメントの

http://docs.python.org/library/signal.html

注信号はI/O操作中に到着したとき

、I/O動作がシグナルハンドラ復帰後に例外を発生させることが可能です。これは、中断されたシステムコールに関する基礎となるUnixシステムのセマンティクスに依存します。

ハンドラからsys.exitを実行しない場合は、破損したパイプおよび/またはファイル書き込みのI/O例外をキャッチする必要があります。

+0

OPがスクリプトをCGIスクリプトとして実行している場合、mod_pythonはここには含まれません。 –

1

スクリプトはサイレントモードではおそらく殺されません。 Pythonがスローする例外は表示されません。スクリプト全体をtry-exceptにラップし、ログファイルに例外を書き込むことをお勧めします。

このようにして、実際に何が起こるかを確認できます。 loggingモジュールはあなたの友人です。

+0

クライアントが終了し、最終的にソケットがタイムアウトすると、ある種のI/Oエラーが発生するはずです。 –

0

atexitモジュールを使用することができます。ドキュメントから

http://docs.python.org/library/atexit.html

のatexitモジュールは、クリーンアップ関数を登録するための単一の関数を定義します。このように登録された関数は、通常のインタプリタ終了時に自動的に実行されます。

注:このモジュールを介して登録された関数は、プログラムがシグナルによって殺されたとき、Pythonの致命的な内部エラーが検出されたとき、またはos._exit()が呼び出されたときは呼び出されません。

これは、sys.exitfunc変数によって提供される機能への代替インタフェースです。

関連する問題