3

任意に実行できる Python 2.6 で書かれた多数のスクリプトがあります。出力を収集して単一のログに表示する単一の中央スクリプトが必要です。

理想的には、次の要件を満たします。

  • すべてのスクリプトは、メッセージを同じ「受信者」に送信して表示します。
  • 最初のスクリプトがメッセージを送信しようとしたときにレシーバーが実行されていない場合は、開始されます。
  • レシーバーは手動で起動および終了することもできます。(終了しても、別のスクリプトがメッセージを送信しようとすると再起動します。)
  • スクリプトは任意の順序で実行でき、同時に実行することもできます。
  • Windows上で動作します。マルチプラットフォームの方が優れていますが、少なくとも Windows 上で動作する必要があります。

私はいくつかのヒントに出くわしました:

それらのピースから、何かを組み合わせることができると思います。これを行う明らかに「正しい」方法があるかどうか、または誰かの過ちから学ぶことができるかどうか疑問に思っています。

4

3 に答える 3

5

これの一部を渡すメッセージに使用することを検討したいと思いlogging.handlers.SocketHandlerます。ロギングタイプのユースケースをすでに念頭に置いているようです。

標準ライブラリのロギング機能は非常に柔軟で構成主導型であるため、要件に合わせて調整できるはずです。

これは、質問の自動再起動部分を処理しません。UNIX の場合は、おそらく pid ファイルを使用しos.kill(pid, 0)て、それが実行されているかどうかを確認するだけですが、Windows の世界でそれらに相当するものが何であるかはわかりません。

于 2010-05-18T00:39:50.367 に答える
1

次のキー コードを使用して、Windows の名前付きパイプを使用するサーバーを構築しました。

    def run( self ):
        # This is the main server loop for the Win32 platform
        import win32pipe
        import win32file
        self.pipeHandle = win32pipe.CreateNamedPipe(
            '\\\\.\\pipe\\myapp_requests',
            win32pipe.PIPE_ACCESS_DUPLEX,
            win32pipe.PIPE_TYPE_BYTE |
            win32pipe.PIPE_READMODE_BYTE |
            win32pipe.PIPE_WAIT,
            1,
            4096,
            4096,
            10000,
            None)
        if self.pipeHandle == win32file.INVALID_HANDLE_VALUE:
            print 'Failed to create named pipe %s!' % self.pipeName
            print 'Exiting...'
            sys.exit(1)
        while True:
            # Open file connection
            win32pipe.ConnectNamedPipe( self.pipeHandle )

            # Run the main message loop until it exits, usually because
            # of a loss of communication on the pipe
            try:
                self.messageLoop()
            except ServerKillSignal:
                break

            # Return the pipes to their disconnected condition and try again
            try: win32pipe.DisconnectNamedPipe( self.pipeHandle )
            except: pass
        win32file.CloseHandle( self.pipeHandle )
        print "Exiting server"

このメソッドは、 win32file.error がスローされるまでmessageLoop()、 を使用してパイプからデータを読み取ります。win32file.ReadFile()その後、終了し、run() が再起動できるようにします。

私の実装では、ユーザーが管理者アクセス権を持っている可能性は低いため、これをシステム サービスとして開始することはできませんでした。代わりに、'\.\pipe\pyccf_requests' でパイプの存在を確認するようにクライアントをコーディングしました。存在しない場合、クライアントは新しいサーバー プロセスを開始します。

于 2010-05-18T00:10:21.347 に答える
0

Dan Head の答えはまさにあなたが望むものです。

項目 2 の「最初のスクリプトがメッセージを送信しようとしたときに受信側が実行されていない場合、開始されます」は、おそらく機能しません。メッセージを受信するには、何かが実行されている必要があります。起動時に起動するデーモン プロセスを作成し、停止した場合は再起動するように Windows に指示することをお勧めします。

于 2010-05-25T02:19:15.233 に答える