2

私は小さなソフトウェアを開発しています。これは、すべての可能なゲームサーバー(コマンドラインがあります)を制御(開始、停止、再起動など-gnu screenを使用)でき、完全なWebインターフェイスを備えた小さなスタンドアロンWebサーバーを含みます( Linuxでは、そこからgnu画面にアクセスできます(接続している場合など)。

ほとんどすべてが機能しており、コードのクリーンアップが必要です。

Pythonで記述されており、スタンドアロンのWebサーバーはcherrypyをフレームワークとして使用します。

問題は、Webインターフェイスでのgnu画面の出力がログファイルを介して行われることです。これにより、有効にするとI / Oが高くなる可能性があります(実行中の内容によって異なります)。

出力をスタンドアロンWebサーバーに直接パイプする方法はありますか(高速である必要があります)?たぶんソケット付きのものかもしれませんが、私はまだそれらを処理する方法を知りません。

4

3 に答える 3

2

を使用してFIFOを作成し、mkfifo mypipe.logそれにログを書き込むと、Pythonからこれを開いて読み込むことができるはずです。PythonとFIFOが役立つ場合があります。ログのハードコピーも必要な場合は、出力をにパイプすることができますtee

于 2013-03-27T12:07:36.113 に答える
1

パイプへの書き込みは機能しますが、パイプからデータを読み取る速度が十分でない場合、コマンド(パイプを書き込むコマンド)がブロックされるため、危険です。

より良い解決策は、ソケットでstdinを公開するローカルの「ログサーバー」を作成することです。これで、コマンドの出力をログサーバーにパイプ処理できます。ログサーバーはstdinから読み取り、入力のコピーをソケットに接続されているすべてのユーザーに送信します。

誰も接続されていない場合、出力は無視されます。

このような「ログサーバー」を作成するのは簡単です(Pythonでは約1時間だと思います)。

追加の利点は、ログファイルの一部をメモリに保持できることです(たとえば、最後の100行)。コマンドがクラッシュした場合でも、ログサーバーから最後の出力を取得できます。

これを機能させるには、stdinがEOFを返すときにログサーバーを終了しないでください。欠点は、古いログサーバーを自分でクリーンアップする必要があることです。ソケットを使用する場合は、Webアプリから「kill」コマンドを送信できます。

于 2013-03-27T14:17:27.213 に答える
0

syslogを使用することも、すべてのログをデータベースに送信するように構成することもできます。

于 2014-08-18T02:56:24.730 に答える