2011-10-27 4 views
0

私はそこに同様の質問があることを知っていますが、私はこの具体的な例に問題があり、良い答えを見つけていません。私はdarのリモートバックアップサーバを設定しようとしています。along these linesです。私はseparate questionに、subprocess.Popenでnetcatを呼び出すことでこれを行うことについて尋ねましたが、可能であれば、ソケットをセットアップし、すべてのパイピングをpythonで行いたいと思っています。いくつかのギグが転送されるので、私はすべての入力を最初に読んでからそれを渡すことはできません。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() 

 
listening 
entering handler 
got: xform 
bound new socket to 0.0.0.0:41658 
accepted connection from 127.0.0.1:42440 

は、次にそれだけでそこに座っている瞬間

は、私は次のコードを持っています。

 
connecting to server 
connected, sending request 
waiting for response 
got: 41300 
connected to dar_xform port 


-------------------------------------------- 
53 inode(s) saved 
with 0 hard link(s) recorded 
0 inode(s) changed at the moment of the backup 
0 inode(s) not saved (no inode/file change) 
0 inode(s) failed to save (filesystem error) 
1 inode(s) ignored (excluded by filters) 
0 inode(s) recorded as deleted from reference backup 
-------------------------------------------- 
Total number of inodes considered: 54 
-------------------------------------------- 
EA saved for 0 inode(s) 
-------------------------------------------- 
dar returned 0 

答えて

0

それが失敗しているサーバー上のdar_xformコマンドのように見える...

試してみてください。また、クライアントとクライアント上darランは、サーバーからの応答を待って立ち往生していますdar_xformコマンドのフルパスをsubprocess.Popen(...)に入力し、問題が引き続き発生するかどうかを確認してください。あなたが説明したことは、特にシェルプロンプトで動作するので、PATHのような疑いがあるようです。

+0

良い考えですが、それでも失敗します。私はそれらを含めるために質問を編集しました。 –

+0

これはおそらく愚かな質問ですが、 'dar_xform'が'/usr/bin'にあることは確かですか? – larsks

+0

はい。すぐ問題はカンマがないことでした。これは、Popenにshell = Trueを追加して捕まえました。私はそれが2つの文字列を連結して得た '/ usr/bin/dar_xform-s'を探しているのを見ました。 13組の目がそれを逃した。私は質問を更新しました。 –

関連する問題