进程在循环中运行而不是每次都记录

时间:2016-10-14 15:40:32

标签: java linux process stream rsync

我有一个类,我可以从shell脚本运行rsync命令。

除非将进程输出(instream和错误流)记录到文件中,否则一切正常。

我的类中有一个循环,如果进程失败,允许5次运行,并且在每次运行中,每个流/写入器/阅读器都会初始化并完全关闭。

问题是文件只在5次运行中被写入一次或两次,并且它永远不会输出相同的运行。在进程之后我设置了10秒的睡眠以使输出更具可读性,我可以看到写入文件的唯一输出是在20秒和30秒之后,或者在10秒和40秒之后等等。

进程中的每个输出都写入控制台而不是文件。

我的代码如下。任何建议将不胜感激。

private static void run() throws IOException {
    while (retry && NUMBER_OF_TRIES >= tries){
        InputStream in = null;
        PrintStream out = null;
        InputStream errIn = null;

        try {
            // get runtime object to run cmd
            Runtime RT = Runtime.getRuntime();

            Process PR = RT.exec( cmd );
            errIn = PR.getErrorStream();
            in = PR.getInputStream();
            out = new PrintStream(new FileOutputStream(new File(output), true));
            System.out.println("file output initialised");
            StreamGobbler inConsumer = new StreamGobbler( in, new Date() + " OUTPUT: ", out );
            StreamGobbler errConsumer = new StreamGobbler( errIn, new Date() + " ERROR: ", out );
            System.out.println("Starting consumer threads");
            inConsumer.start();
            errConsumer.start();

            Thread.sleep(10000);

            int exitVal = PR.waitFor();
            if (exitVal > 0){
                retry = true;
                tries++;
            } else {
                retry = false;
            }
            System.out.println("ExitValue: " + exitVal);

            // Wait for the consumer threads to complete
            inConsumer.join();
            errConsumer.join();         

        } catch ( Exception e ) {

            e.printStackTrace();
            System.out.println( "failed: " + e.getMessage() );
        } finally {
            // the StreamConsumer classes will close the other streams
            if ( out != null ){
                out.close();
            }
            if (in != null){
                in.close();
            }
            if (errIn != null){
                errIn.close();
            }               
        }
    }
}

1 个答案:

答案 0 :(得分:0)

除了初始化之外,我还没有看到你的printstream对象被“out”使用过。如果要写入文件,则应调用printstream对象。

System.out.println("ExitValue: " + exitVal);
//now call the printstream object
out.print("ExitValue: " + exitVal);
//flushing will force the string to be written to the file
out.flush();

每次写入控制台时都可以按照上面的代码进行操作,并希望写入使用。创建打印流对象的文件。