1

似たような質問があることは知っていますが、この具体的な例に問題があり、良い答えが見つかりません。これらの行に沿って、dar のリモート バックアップ サーバーをセットアップしようとしています。subprocess.Popenでnetcatを呼び出すことでこれを行うことについて別の質問をしましたが、可能であればソケットをセットアップし、すべてのパイピングをPythonで行うことをお勧めします。いくつかのギグが転送されるため、最初にすべての入力を読み取ってから渡すことはできません。

問題は、サーバーがデータを読み取っていないように見えることです。

現時点では、次のコードがあります。

from socket import socket, AF_INET, SOCK_STREAM
import sys
import SocketServer
import subprocess

class DarHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print('entering handler')
        data = self.request.recv(1024).strip()
        print('got: ' + data)
        if data == 'xform':
            s = socket(AF_INET, SOCK_STREAM)
            s.bind(('',0))
            myaddr, myport = s.getsockname()
            print('bound new socket to {0}:{1}'.format(myaddr, myport))
            self.request.send(str(myport))
            s.listen(1)
            conn, remoteaddr = s.accept()
            print('accepted connection from {0}:{1}'.format(*remoteaddr))
            xform_input = conn.makefile('rb',0)
            proc = subprocess.Popen(
                ['/usr/bin/dar_xform', '-s', '10k', '-', 'archives/sockbackup',],
                 stdin=xform_input
            )
            return_code = proc.wait()
            print('dar_xform returned {0}'.format(return_code))
            conn.close()
            self.request.send(str(return_code))
        else:
            self.request.send('bad request')
        print('send result, exiting handler')

server_address = ('localhost', 18010)
def server():
    server = SocketServer.TCPServer(server_address, DarHandler)
    print('listening')
    server.serve_forever()

def client():
    sock = socket(AF_INET, SOCK_STREAM)
    print('connecting to server')
    sock.connect(('localhost', 18010))
    print('connected, sending request')
    sock.send('xform')
    print('waiting for response')
    port = sock.recv(1024)
    print('got: ' + port)
    s = socket(AF_INET, SOCK_STREAM)
    s.connect(('localhost', int(port)))
    print('connected to dar_xform port')
    dar_output = s.makefile('wb',0)
    return_code = subprocess.call(
          ['/usr/bin/dar', '-B', 'config/test.dcf', '-c', '-',], 
          stdout=dar_output
    )
    print('dar returned {0}'.format(return_code))
    s.close()
    result = sock.recv(1024)
    print('received: ' + result)
    sock.close()
    print('socket closed, exiting')

if __name__ == "__main__":
    if sys.argv[1].startswith('serv'):
        server()
    else:
        client()

クライアントを実行すると、サーバー側から次の出力が得られます。

聞いている
ハンドラーに入る
得た:xform
新しいソケットを 0.0.0.0:41658 にバインド
127.0.0.1:42440 からの接続を受け入れました

それからそれはただそこに座っています。その間、クライアントでdar実行され、クライアントはサーバーからの応答を待ってスタックします。

サーバーにつなげる
接続、リクエストの送信
応答待ち
得た: 41300
dar_xform ポートに接続


 --------------------------------------------
 53 個の inode が保存されました
 0 個のハード リンクが記録されている
 バックアップ時に 0 個の inode が変更されました
 0 個の inode が保存されていません (inode/ファイルの変更なし)
 0 個の inode を保存できませんでした (ファイルシステム エラー)
 1 個の inode が無視されました (フィルターによって除外されました)
 参照バックアップから削除されたと記録された 0 個の inode
 --------------------------------------------
 考慮される inode の総数: 54
 --------------------------------------------
 EA は 0 inode 用に保存されました
 --------------------------------------------
dar は 0 を返しました
4

1 に答える 1

0

サーバー上の dar_xform コマンドが失敗しているようです...

dar_xformコマンドへのフル パスを指定しsubprocess.Popen(...)て、引き続き問題が発生するかどうかを確認してください。あなたが説明したことはPATH、特にシェルプロンプトで機能するため、疑わしい問題のように見えます。

于 2011-10-27T20:45:18.857 に答える