Java读取Linux实时文件阻塞的一个折中解决办法

其实也是无奈之举,远程连接Linux,通过bufferReader()不能获取到实时刷新的输出,获取不到换行符,造成readline()方法阻塞,网上查了下,没有很好的解决办法,使用read也获取不到,于是用了一种比较折中的办法:

首先是远程执行命令的executeBack()方法,这个之前有写过,不再说啥了:

public String executeBack(String ip, String cmd) {
        String username = "root";
        String password = "password";
        try {
            // 创建连接
            Connection conn = new Connection ( ip, 22 );
            // 启动连接
            conn.connect ();
            // 验证用户密码
            conn.authenticateWithPassword ( username, password );
            Session session = conn.openSession ();
            //执行命令
            session.execCommand ( cmd );
            InputStream stdout = new StreamGobbler ( session.getStdout () );
            BufferedReader br = new BufferedReader ( new InputStreamReader ( stdout ) );
            StringBuffer stringBuffer = new StringBuffer ();

            while (true) {
               
                String line = br.readLine ();
                stringBuffer.append ( line );
                if (line == null) {
                    session.close ();
                    break;
                }
            }
            String result = stringBuffer.toString ();
            conn.close ();
            return result;
        } catch (IOException e) {
            e.printStackTrace ();
            return null;
        }
    }

然后,我是想读取xtrabackup的实时备份输出,当读取到"was copied"证明copy成功了,但是这样并不行,于是把输出先重定向到文件里,之后再读文件这样:

public void xtraBack(String port) {

        String backupIp = "xx.xx.xx.xx";
        int checkResult = 0;

        System.out.println ( executeBack ( backupIp, "echo 开始备份" + port + "端口:" ) );
        executeBack ( backupIp, "rm -rf /data/XtraBackup/*" );
        executeBack ( backupIp, "mkdir /data/XtraBackup/" + port );
        executeBack ( backupIp, "innobackupex --defaults-file=/data/" + port + "/conf/my.cnf --socket=/data01/" + port + "/tmp/mysql.sock --user=root --password=password /data0/XtraBackup/" + port+">/data/shell/logs/backup.log 2>&1");
        System.out.println (  port + "端口备份完成,开始验证备份是否成功..." ) ;
       
        //这里加了个定时读取文件的操作,因为备份需要时间,不能一直去查
        if (timeCheck( port ) > 0) {
            System.out.println ( "completed OK! " + port + "端口数据库备份成功!" );
            //return flag;
        } else {
            System.out.println ( "备份失败" );
        }
    }

主要就是把输出通过重定向到log文件里,>/data/shell/logs/backup.log 2>&1,这样就不会阻塞,可以正常结束流程,执行之后的方法 。实时读取真的是太坑了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fancy橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值