1

このプロジェクトを mod_perl で実行すると、ホストに関する情報が表示されます。このページには、ユーザーがホストに ping/nslookup/traceroute できるようにするドロップダウン付きのテキスト ボックスがあります。出力は のようにテキスト ボックスに表示されますtail -f

CGIの下でうまく機能します。ユーザーが ping を要求すると、サーバーに対して AJAX 呼び出しが行われ、そこで基本的に ping が開始され、出力が一時ファイルに送られます。その後、ping が終了するまで出力が更新されるように、後続の ajax 呼び出しはファイルを「末尾」にします。ジョブが完了すると、一時ファイルは削除されます。

ただし、mod_perl の下では、何をしてもゾンビ プロセスの作成を停止できます。私はあらゆることを試しました。ダブル フォーク、使用IPC::Runなどです。最終的に、システム コールは mod_perl では推奨されません。

私の質問は、これを行うためのより良い方法があるのではないでしょうか? コマンド ライン ジョブを作成し、mod_perl で動作する出力をテーリングするための CPAN モジュールはありますか? 私はいくつかの提案を探しています。

詳細を通知して更新を取得する、ある種の「ジョブ」デーモンを作成できる可能性があることはわかっています。コマンドを実行し、ステータスなどを追跡します。しかし、もっと簡単な方法はありますか?

前もって感謝します。

4

1 に答える 1

0

私はこれについて短い時間枠を持っていて、CPAN で運がなかったので、ここで私の解決策を提供します (おそらく車輪を再発明しました)。私はすぐに何かをしなければなりませんでした。

この例では ping を使用します。

ユーザーが ping を要求すると、AJAX スクリプトは、ping の詳細 (ホスト、間隔、カウントなど) を含むレコードをデータベースに作成します。レコードには自動インクリメント ID フィールドがあります。次に、デーモン化された perl スクリプトであるジョブ デーモンに SIGHUP を送信します。

このジョブ デーモンは SIGHUP を受け取り、データベース内の新しいジョブを探して、それぞれを処理します。新しいジョブを取得すると、分岐し、PID と「実行中」ステータスを DB レコードに書き込み、一意のジョブ ID に基づいて stdout/stderr ファイルを開き、IPC::Runこれらのファイルに STDOUT/STDERR を送信するために使用します。

ジョブ デーモンは、フォークされたジョブを追跡し、実行時間が長すぎる場合は強制終了します。

出力を追跡するために、AJAX スクリプトはジョブ ID をブラウザーに送り返します。次に、Javascript タイマーで AJAX スクリプトが呼び出され、基本的にデータベース レコードを介してジョブのステータスをチェックし、ファイルを追跡します。

ping が終了すると、ジョブ デーモンはレコード ステータスを「完了」に設定します。AJAX スクリプトは、定期的なステータス チェックでこれをチェックします。

このようにした理由の 1 つは、AJAX スクリプトとジョブ デーモンが通信し、認証手段 (DB​​) を介して行うためです。

于 2010-05-27T01:30:51.077 に答える