ajax+paramiko执行耗时脚本问题

单蛙 发布于 2017/07/07 20:08
阅读 607
收藏 0

收藏!数据建模最全知识体系解读!>>>

ajax post到django后台,paramiko远程执行耗时为5分钟的脚本,并取回echo值

执行结果为,一次成功,一次失败,交替进行。

前后端代码如下:

$.ajax({
              type: 'POST',
              url:  "/android/test_deploy_one/"+sub_id+"/?fresh=" + Math.random(),
              data: {csrfmiddlewaretoken:'{{csrf_token}}' },
              timeout : 600000, //超时时间:600秒
              success: function(data){
                layer.close(ii);
                if(data == "success"){
                    show_info_msg("完成");
                }else{
                    show_info_msg("失败");
                }
               subTable.ajax.reload()
              },
              error: function (XMLHttpRequest, textStatus, errorThrown) {
                  alert(XMLHttpRequest.status); //失败时为0
                  alert(XMLHttpRequest.readyState);//失败时为0
                  alert(textStatus);//失败时为 error
              }
});
    def exe_and_get_echo(self, cmd_script):
        """
        远程执行脚本,并且返回脚本的打印输出
        :return:
        """
        console = ""
        s = paramiko.SSHClient()
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            s.connect(self.ip, port=self.port, username=self.username, password=self.password, timeout=self.timeout,
                      allow_agent=False, look_for_keys=False)
            #失败时,uwsgi日志在这里卡住,前端status 为fail
            stdin, stdout, stderr = s.exec_command(cmd_script, timeout=600)
        except Exception as e:
            return console
        else:
            console = stdout.read()
        s.close()
        return console

奇怪的是即使成功,也有时报下面的错误:

Fri Jul  7 19:57:30 2017 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /android/test_deploy_one/14/?fresh=0.97083899214899 (ip 172.16.169.220) !!!
Fri Jul  7 19:57:30 2017 - uwsgi_response_writev_headers_and_body_do(): Broken pipe [core/writer.c line 296] during POST /android/test_deploy_one/14/?fresh=0.97083899214899 (172.16.169.220)
OSError: write error

求大神解答。

加载中
0
ops-coffee
ops-coffee

对于耗时任务建议后端采用异步方式,前端请求后端之后,后端开始执行程序同时返回执行中状态给前端,前端每隔1s去请求下后端获取最新状态,以避免后端请求时间过长产生的问题,Django异步可以用celery,这里有详细文档:https://mp.weixin.qq.com/s/lXrp3igYo9W2UuE5Gauysg

返回顶部
顶部