Webサーバーから長時間実行されるプロセスを起動し、データベースでそれらのプロセスを追跡しようとしているようです。それは不可能ではありませんが、推奨される方法ではありません。
主な問題は、実際に行うために、HTTPリクエストを現在Webサーバーで処理する必要があることです。 何でも(システムで実行されているプロセスの追跡を含む)-常に実行できるものが必要です...
代わりに、別のデーモン化された「マネージャー」プロセス(perlについて言及しているように、それを書き込むのに適した言語)を作成して、長時間実行されるタスクを(PIDとシグナルによって)追跡することをお勧めします。 SQLデータベースを更新するプロセス。
次に、「マネージャー」プロセスに、Webサーバーから新しいプロセスを開始する要求をリッスンさせることができます。使用できるさまざまなIPCメカニズムがあります。 (例:シグナル、SysV shm、unixドメインソケット、ZeroMQなどのインプロセスキューなど)。
これには複数の利点があります:
- 生成されたスクリプトを(システムまたは相互に)ユーザー/グループベースの分離で実行する必要がある場合、Webサーバーをrootとして実行したり、setgidしたりする必要はありません。
- 生成されたプロセスが「クラッシュ」した場合、シグナルが「マネージャー」プロセスに配信されるため、問題なく誤実行を追跡できます。
- インプロセスキュー(例:ZeroMQ)を使用してリクエストを「マネージャー」プロセスに配信すると、ウェブサーバーからのリクエストを「スロットル」できます(ユーザーが意図的または誤ってD.O.Sを引き起こさないようにするため)。 >
- 生成されたプロセスが正常に終了するかどうかに関係なく、追跡データベースを更新するためにWebサーバーへの「アクティブな」HTTPリクエストは必要ありません。
すべきかどうかについて 実行中実行中、それは本当にあなたのセマンティクス次第です。 (つまり、既知の実行時間に基づいていますか?消費されたデータに基づいていますか?など)
かどうかの確認 実行には2つの要素があります:
- 「マネージャー」プロセスは、生成されたPIDを含め、必要に応じてデータベースを更新します。
- Webサーバーでホストされているコードは、実際にプロセスを一覧表示して、データベース内のPIDが実際にであるかどうかを判断できます。 走っていて、どれだけの時間でも何か役に立つことをしているのです!
そうでないかどうかの確認 実行は規則に基づいている必要があります:
- 生成されたプロセスに予測可能な名前を付けます。
- プロセスリストを取得して、実行されるべきではないものがまだ実行されている(機能していない?)かどうかを判断します。
いずれの場合も、プロセスの生成を要求したユーザーに通知するか、実際に何かを実行することができます。
1つのアプローチは、SQLデータベースから読み取り、ps
を実行するCRONジョブを使用することです。 生成されたプロセスを再起動する必要があるかどうかを判断し、Webサーバーで使用されているのと同じIPCメカニズムを使用して「マネージャー」プロセスが再起動するように再要求します。追跡/監視/ロギングで開始と再開をどのように区別するかはあなた次第です。
サーバー自体の電源が切れたりクラッシュしたりした場合は、「マネージャー」プロセスに最初の実行時にクリーンアップを実行させることができます。例:
- サーバーがシャットダウンされる前に正常に実行されていた、生成されたプロセスのエントリをデータベースで探します。
- PIDと実行時間でこれらのプロセスを確認します (これは重要です)。
- 完了しなかったスポーンされたプロセスを再スポーンするか、データベースに何かを保存して、これが事実であることをWebサーバーに示します。
アップデート#1
あなたのコメントによると、ここに始めるためのいくつかの指針があります:
あなたはperlについて言及したので、そこにある程度の習熟度があると仮定します。ここに、「マネージャー」プロセススクリプトの作成に役立ついくつかのperlモジュールがあります。
まだよく知らない場合は、 CPAN 基本的に何でもするperlモジュールのリポジトリです。
Daemon ::Daemonize -ログアウト後も実行を継続するようにプロセスをデーモン化します。デーモンを開始/停止/再起動するためのスクリプトを作成するためのメソッドも提供します。
Proc ::Spawn
-子スクリプトの「生成」を支援します。基本的にfork()
を実行します 次にexec()
、ただし、子プロセスのSTDIN / STDOUT / STDERR(またはtty)も処理します。これを使用して、長時間実行されるperlスクリプトを起動できます。
Webサーバーのフロントエンドコードがまだperlで記述されていない場合は、プロセス間メッセージの受け渡しとキューイングのためにかなり移植性の高いものが必要になります。おそらく、Webサーバーのフロントエンドを簡単にデプロイできるもの(PHPなど)にします。
ここに2つの可能性があります(多く 詳細):
- Perl
および
PHP SpreadToolkit の実装 。 - Perl
および
PHP ZeroMQ の実装 ライブラリ。
Proc ::ProcessTable -このチェックは、実行中のプロセスで使用できます(そして、上記で説明したように、あらゆる種類の統計を取得できます)。
Time ::HiRes -このパッケージの高粒度時間関数を使用して、「スロットリング」フレームワークを実装します。基本的には、単位時間あたりにデキューするリクエストの数を制限するだけです。
DBI (mysql を使用 )-「マネージャー」プロセスからMySQLデータベースを更新します。