サーバー側のスクリプトを永久に実行する方法は何ですか?
質問
Pythonのようなサーバー側スクリプトを実行する必要があります" forever&quot ;; (または状態を失うことなくできるだけ長く)、ソケットを開いたままにすることができますそして、受信したデータなどのイベントに非同期的に反応します。たとえば、ソケット通信に Twisted を使用している場合。
- このようなものをどのように管理しますか?
- 私は混乱していますか?または、非同期ソケット通信を実装するより良い方法はありますか?
- Apacheサーバーを介してスクリプトを1回起動した後、実行を停止するにはどうすればよいですか
解決
twistedを使用している場合、デーモンを起動および停止するためのインフラストラクチャ全体があります。
http://twistedmatrix.com/projects/core/documentation/howto /application.html
このようなものをどのように管理しますか?
Twistedはこれに適しています。上のリンクを読んでください
混乱していますか?または、非同期ソケット通信を実装するより良い方法はありますか?
Twistedは非同期ソケット通信に非常に適しています。あなたがそれのこつを得るまで、それは脳に難しいです!
Apacheサーバー経由でスクリプトを1回起動した後、実行を停止するにはどうすればよいですか
ツイストツールはコマンドラインアクセスを想定しているため、何をしたいかを理解している場合は、ツールを起動/停止するためのcgiラッパーを作成する必要があります。
他のヒント
接続が発生するのを待機し、シグナルが閉じるのを待機するwhileブロックに継続的にあるスクリプトを書くことができます。
http://docs.python.org/library/signal.html
それを停止するには、その信号を彼に送信する別のスクリプトを実行するだけです。
「ダブルフォーク」を使用して、古いバックグラウンドプロセスにバインドされていない新しいバックグラウンドプロセスでコードを実行できます。たとえば、このレシピに、必要以上に説明的なコメントを付けてください。
これをWebサイトのバックグラウンドタスクを実行する主な方法として推奨しません。たとえば、PythonがApacheプロセスに埋め込まれている場合、必要以上に分岐することになります。デーモンを個別に起動する方がよい(同様の低特権ユーザーの下で)。
Apacheサーバー経由でスクリプトを1回起動した後、実行を停止するにはどうすればよいですか
2番目のフォークでデーモンプロセスのプロセス番号(pid)をファイルに書き込み、そのファイルからpidを読み取り、終了信号を送信します( os.kill(pid、signal.SIG_TERM )
)。
私は混乱していますか?
それが質問です!何らかの異常なネットサービスのために、Webインターフェイスへの別のポートで応答するバックグラウンドプロセスを試みていると思います。これを行っていないはずの通常のWeb要求への応答について単に話している場合は、Apacheを使用してソケットを処理し、一度に1つの要求を処理する必要があります。
Comet が探しているものだと思います。竜巻もご覧ください。
FastCGIを見たいかもしれません。探しているものとまったく同じように聞こえますが、現在開発中かどうかはわかりません。 CGIデーモンと特別なapacheモジュールを使用して通信します。デーモンは長時間実行されているため、fork / execのコストはかかりません。ただし、独自のリソースを管理するコストとして(リクエストごとに自動でクリーンアップは行われません)
このスタイルのFastCGIが使用されなくなった理由の1つは、インタープリターをApacheバイナリに埋め込み、サーバーで実行する方法があることです。私はmod_pythonに精通していませんが、mod_perlには長時間実行プロセスを許可する構成があることを知っています。サーバーで長時間実行されているプロセスがリソースリークを引き起こす可能性があるため、ここで注意してください。
一般的な質問は、何をしたいですか?なぜこの2番目のプロセスが必要なのに、Apacheによって何らかの形で制御されるのですか?なぜ、Apacheと通信するデーモンを構築するだけでよいのですか、Apacheで制御する必要があるのはなぜですか?