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(s) 未保存(无 inode/文件更改)
 0 个 inode 未能保存(文件系统错误)
 1 个 inode(s) 被忽略(被过滤器排除)
 0 个 inode(s) 记录为从参考备份中删除
 ------------------------------------------
 考虑的 inode 总数:54
 ------------------------------------------
 EA 保存 0 个 inode(s)
 ------------------------------------------
dar 返回 0
4

1 回答 1

0

看起来服务器上的 dar_xform 命令失败了......

尝试提供dar_xform命令的完整路径subprocess.Popen(...),看看是否仍然存在问题。你所描述的看起来像是一个可疑的PATH问题,特别是因为它在 shell 提示符下工作。

于 2011-10-27T20:45:18.857 回答